![ASP.NET程序设计教程(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/755/33643755/b_33643755.jpg)
3.10 C#新增功能
C#中新增了很多实用功能,如隐式类型声明、对象初始化器等,这些功能的使用进一步方便了程序的编写。本节将就这些新功能进行讲解。
3.10.1 可选参数和命名参数
可选参数和命名参数是两个截然不同的概念,不过,它们经常放在一起使用。在调用方法时可以忽略可选参数;命名参数则是可以根据参数的名称来为参数赋值,而不需要根据参数在参数列表中的位置来为其赋值。
1.可选参数
在定义方法时,只要给参数指定一个默认值,该参数就变成了可选的。在调用该方法时,该参数可以忽略。例如:
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/66_03.jpg?sign=1739220415-xzFTVUZrhC8rsFmPT3Kwwv15VObYjrSM-0-a9ba43c899157062998e75d01d48aaea)
在这个方法里,i是必须参数,j和k是可选参数,在调用时可以忽略j和k。如表3-27所示。
表3-27 可选参数示例
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/66_04.jpg?sign=1739220415-ERLgVcUofS6Y82XZsYA8TOHgpZO3rbnM-0-467cf40b9fbc98272bacc2518a08e21f)
从这里我们可以发现,这个功能和重载函数很像。可选参数类似于重载函数,不过它比重载函数减少了很多的代码。也许会想到,如果程序中还有一个方法,该方法与可选参数不带某个参数的方法相同时,调用该方法,会出现怎样的情景呢?例如:
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/67_01.jpg?sign=1739220415-uofMkiE04ezlgr1zkXVxHPqsPOiUoj41-0-0e282f0aef5d65bf6311d998d257f02f)
当调用N(3,4)时,会优先调用没有可选参数的方法。
2.命名参数
在上面的方法中,除了必须参数外,如果只想传入第三个参数k,需要怎么做呢?这就需要用到下面要提到的命名参数。
命名参数允许在调用方法时,根据参数的名字传递参数,这种情况下可以忽略参数的顺序,以任意顺序传参。例如,如果只想传入第三个参数k,可以有以下三种方式,如表3-28所示。
表3-28 命名参数示例
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/67_02.jpg?sign=1739220415-XNPsLnx7vU7tDQPrsssQlb5j567RkQi7-0-bd36476113375a11e7fd77ff106018f8)
3.10.2 动态对象
在C#4.0中,新增了一个关键字dynamic,而且新增了一个命名空间System.Dynamic来实现对此对象的支持。到底dynamic是做什么的呢?先看下面的例子。
在编写类时,通常的写法如下。
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/67_03.jpg?sign=1739220415-1ZAKBEyQX4V0afi7TmxUHqJjDchj1OES-0-a3614787a4f36d4302899caf76f8fd02)
C#3.5的自动属性简化了这类程序的编写,对使用一些没有业务逻辑编码的属性代码时,使用自动属性简化了编写代码的复杂性,上面的代码改为自动属性方式,代码如下所示。
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/67_04.jpg?sign=1739220415-fPIX1yUsH4nzzANPt1IuurANgndh82w2-0-76f55f818a379be01e5027b2d1b07867)
在声明时只需要指明访问范围修饰符、数据类型,同时给属性名称指定两个空的get和set访问器即可,在编译时系统将自动生成局部变量,并自动添加相应的代码。
3.10.3 对象初始化器
在实际编程时,程序员通常会写出如下代码。
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/67_05.jpg?sign=1739220415-DYFVHeaZJRhjEGnZ8H9fcIaNFdToUcYQ-0-c6e72fd6250bd36f8e3ba652b060ce46)
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/68_01.jpg?sign=1739220415-SQ437FxkwT1sVeYSH6QDDmJw2pLNTyPs-0-81e4a7ec6e1838ce8b597528c35222d4)
如果把这样的编码简化成一行,将是多么方便的事情,C#3.5的对象初始化器就将这一设想变成了现实。使用对象初始化器(object Initializers),上面的代码可以简化为如下代码。
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/68_02.jpg?sign=1739220415-faYg5HuKo9fcL17qWGJoXBG8de8va4xm-0-8858a06f905053e50e1ef03ae971a54a)
一行代码,实现与四行代码同样的功能。使用对象初始化器,开发人员在实例化对象的时候就可以直接进行赋值操作。对象初始化器使程序员进一步感受到了C#新版本使编程更轻松、更高效这一特点。
3.10.4 匿名类型
匿名类型,是指不具有名称的类型。隐式类型可以不指明变量的类型,而匿名类型则可以使变量不具有名称。
有时程序员并不需要任何方法、事件,此时程序员可以不用显式地去定义一个类,而直接使用匿名类型完成工作。匿名类型是隐式声明和对象初始化器的结合应用。前例采用匿名类型,可以简写为以下一行代码。
![](https://epubservercos.yuewen.com/922581/17977546408668006/epubprivate/OEBPS/Images/68_03.jpg?sign=1739220415-gZNdJ3jWxbJMhKXKA6S0ui5JbYgpuSxC-0-cf30847d51ea44f793c8af05cf7c17c1)