11年 C# 4.0四大新特性代码示例与解读

摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。

  之前的文章中,我们曾介绍过C#的历史及C# 4.0新增特性,包括:dynamic、 命名和可选参数、动态导入以及协变和逆变等。今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。

  1.dynamic ExpandoObject

  熟悉js的朋友都知道js可以这么写 :

var t = new Object(); t.Abc = ‘something’; t.Value =243;

  现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:

static void Main(string[] args)
  {

dynamic t = new ExpandoObject();

t.Abc ="abc";

t.Value =10000;
        Console.WriteLine("t‘s abc = {0},t‘s value = {1}", t.Abc, t.Value);

Console.ReadLine();

  }

  C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是C#向动态语言过渡的一种试探吧。

  2.泛型自动转换

  在C# 4.0之前下面的代码是不可以编译通过的

IEnumerable<object> objs = new List<string> { "I‘m 0","I‘am 1","I‘am 2" };

  在C# 4.0中这种声明是允许的,不过也仅限于泛型接口,泛型类型的类似做法是不允许的,如下代码是有编译错误的

List<object> objList = new List<string> { "I‘am 0","I‘am 1","I‘am 2" };

  3.方法参数之可选参数

  如下方法声明的语法

static void DoSomething(int notOptionalArg, string arg1 ="default Arg1", string arg2 ="default arg2")
  {
      Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
  }

  这个方法有三个参数第一个是必选参数,第二个和第三个是可选参数,他们都有一个默认值。

  这种形式对固定参数的几个方法重载很有用。如下调用:

static void Main(string[] args)
  {
        DoSomething(1);
        DoSomething(1, "葫芦");
        DoSomething(1, "葫芦", "黄瓜");
        Console.ReadLine();
  }

  也许你会想到,假如我有一个和可选参数方法某个参数相同的方法签名的方法时,C#会怎么处理呢,我们看下下面的代码

static void DoSomething(int notOpArg, string arg)
  {
        Console.WriteLine("arg1 = {0}", arg);
    }

  这里又重载了一个DoSomething这个方法有两个参数,但是没有可选参数,

  实验证明调用DoSomething(1,”arg”)时会优先执行没有可选参数的方法。

  4.方法参数之命名参数

  命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。如下方法声明:

static void DoSomething(int height, int width, string openerName, string scroll)
  {
        Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
  }

  我们可以这样来调用上面声明的方法

static void Main(string[] args)
  {
      DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
      Console.ReadLine();
  }

  很显然的这是一个语法糖,但是在方法参数很多的情况下很有意义,可以增加代码的可读性。

时间: 2024-11-05 21:44:15

11年 C# 4.0四大新特性代码示例与解读的相关文章

Java8新特性代码示例(附注释)- 方法引用,Optional, Stream

/** * java8中的函数式接口,java中规定:函数式接口必须只有一个抽象方法,可以有多个非抽象方法,同时,如果继承实现了 * Object中的方法,那么也是合法的 * <p> * 函数式接口可以使用lambda来创建 */ @FunctionalInterface interface MyService { void sayMessage(String msg); @Override boolean equals(Object obj); } /** * 入口 * @param arg

Atitit jquery &#160;1.4--v1.11 &#160;v1.12 &#160;v2.0 &#160;3.0 的新特性

Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.html   2016.11 1.1.1. jQuery.htmlPrefilter()1 1.2. 2016.7  jq3.0 新特性1 1.3. Jq3.1新特性 jQuery 3.1.1 发布了,该版本包括一些 BUG 修复和改进.3 1.1. Jquery1.12  jQuery 2.2 和

安卓6.0(棉花糖)新特性汇总

安卓6.0(棉花糖)新特性汇总 Android伴随着众多新特性和新功能,Android6.0(API level 23)在系统和API上都有着诸多的改变. 1.App Permissions(软件权限管理) 在安卓6.0里,应用许可提示可以自定义了.它允许对应用的权限进行高度管理,比如应用能否使用位置.相机.麦克风.通讯录等,这些都可以开放给开发者和用户. 作为开发者,当你的app的目标版本(target)为Android6.0(API 23)或更高时,请确保在运行时进行权限的检查和请求.其中,

PHP7.0 的新特性

PHP7.0 的新特性经常会被面试官问到,在平时的项目开发中运用它们也会提升一定的代码质量和代码运行性能,可见这个知识点的重要性.不过有很多人都没有去系统的了解掌握,今天我刚好系统整理了一番分享出来. 图片版 文字版 1. 新增了标量类型声明和函数的返回值类型声明 例如: <?php declare(strict_types=1)//1:严格模式 0:强制模式(默认) class OrderService extends BaseService { ... /** * 所有订单详情都是通过这个入

相比于python2.6,python3.0的新特性。

这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法.例如: Old: print "The answer is", 2*2 New: print("The answer is", 2*2) Old: print x,       

C# 6.0语法新特性体验(二)

之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性,现在随着Visual Studio 14 CTP3的发布,又陆续可以体验一些新的特性了,这里简单的介绍一下之前没有介绍的新语法. 属性表达式(Property Expressions) 我们常常会在类中写一些通过函数生成的只读属性: ????class Point????{????????public int X { get; set; }????????public int Y { get; set; }

在Visual Studio 14 CTP中启用C# 6.0的新特性

今天看到Visual Studio 14 CTP版本已经发布了,支持了一些c++ 及C# 6.0的新特性,便下载下了尝鲜试了一下. C++到还好,使用C#的新特性就有点麻烦了,需要在csproj文件中加上这样一行才能使用     <LangVersion>experimental</LangVersion> 最开始我想写个VS插件来弄下.试了下找不到啥相关的API,便改写了一个小程序来转换它,使用了后还是觉得但文件太多时候很麻烦. 就干脆写了一个小程序把所有的模板中都添加了这一项,

OSChina 技术周刊第二十四期 —— C# 6.0 的新特性

每周技术抢先看,总有你想要的! 移动开发 [博客]Swift社交应用文本输入优化汇总 服务端开发/管理 [翻译]HTTP/1 的最佳实践并不适合 HTTP/2 [翻译]使用 AppDomain 存储实现大数据集合 [翻译]AngularJS 对比 React [软件]PHP 论坛软件 PHPHub [软件]监控和告警系统 Bosun [软件]多主机容器网络 SocketPlane [博客]Django学习笔记 [博客]Tornado源码分析-Web Framework [博客]话说对 Hiber

servlet3.0 的新特性之二注解代替了web.xml配置文件

servlet3.0 的新特性: 注解代替了 web.xml 文件 支持了对异步的处理 对上传文件的支持 1.注解代替了配置文件 1.删除了web.xml 文件 2. 在Servlet类上添加@WebServlet(urlPatterns={"/AServlet"}) 3. 在Filter类上添加@WebFilter(urlPatterns="/AFilter") 4. 在Listener类上添加@WebListener ? 总结: * 注解好处:配置信息少,使用很