
3.10 C#新增功能
C#中新增了很多实用功能,如隐式类型声明、对象初始化器等,这些功能的使用进一步方便了程序的编写。本节将就这些新功能进行讲解。
3.10.1 可选参数和命名参数
可选参数和命名参数是两个截然不同的概念,不过,它们经常放在一起使用。在调用方法时可以忽略可选参数;命名参数则是可以根据参数的名称来为参数赋值,而不需要根据参数在参数列表中的位置来为其赋值。
1.可选参数
在定义方法时,只要给参数指定一个默认值,该参数就变成了可选的。在调用该方法时,该参数可以忽略。例如:

在这个方法里,i是必须参数,j和k是可选参数,在调用时可以忽略j和k。如表3-27所示。
表3-27 可选参数示例

从这里我们可以发现,这个功能和重载函数很像。可选参数类似于重载函数,不过它比重载函数减少了很多的代码。也许会想到,如果程序中还有一个方法,该方法与可选参数不带某个参数的方法相同时,调用该方法,会出现怎样的情景呢?例如:

当调用N(3,4)时,会优先调用没有可选参数的方法。
2.命名参数
在上面的方法中,除了必须参数外,如果只想传入第三个参数k,需要怎么做呢?这就需要用到下面要提到的命名参数。
命名参数允许在调用方法时,根据参数的名字传递参数,这种情况下可以忽略参数的顺序,以任意顺序传参。例如,如果只想传入第三个参数k,可以有以下三种方式,如表3-28所示。
表3-28 命名参数示例

3.10.2 动态对象
在C#4.0中,新增了一个关键字dynamic,而且新增了一个命名空间System.Dynamic来实现对此对象的支持。到底dynamic是做什么的呢?先看下面的例子。
在编写类时,通常的写法如下。

C#3.5的自动属性简化了这类程序的编写,对使用一些没有业务逻辑编码的属性代码时,使用自动属性简化了编写代码的复杂性,上面的代码改为自动属性方式,代码如下所示。

在声明时只需要指明访问范围修饰符、数据类型,同时给属性名称指定两个空的get和set访问器即可,在编译时系统将自动生成局部变量,并自动添加相应的代码。
3.10.3 对象初始化器
在实际编程时,程序员通常会写出如下代码。


如果把这样的编码简化成一行,将是多么方便的事情,C#3.5的对象初始化器就将这一设想变成了现实。使用对象初始化器(object Initializers),上面的代码可以简化为如下代码。

一行代码,实现与四行代码同样的功能。使用对象初始化器,开发人员在实例化对象的时候就可以直接进行赋值操作。对象初始化器使程序员进一步感受到了C#新版本使编程更轻松、更高效这一特点。
3.10.4 匿名类型
匿名类型,是指不具有名称的类型。隐式类型可以不指明变量的类型,而匿名类型则可以使变量不具有名称。
有时程序员并不需要任何方法、事件,此时程序员可以不用显式地去定义一个类,而直接使用匿名类型完成工作。匿名类型是隐式声明和对象初始化器的结合应用。前例采用匿名类型,可以简写为以下一行代码。
