购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 C# 4.0中的新特性

在本节中将介绍C# 4.0中的新特性——dynamic类型、命名和可选参数、类型等价支持、协变和逆变等。

1.5.1 Visual C# 4.0 dynamic类型

随着Visual Studio 2010的发布,C#的版本也升级到了4.0。C# 4.0的主题就是动态编程,虽然C#仍然是一种静态语言,但是其对象的意义开始变得越来越“动态”。在Visual C# 4.0中引入了一种新的dynamic类型,该类型是一个静态的(static)类型,但是一个dynamic类型的对象会绕过静态类型检查。在大多数情况下dynamic和object类型有些相似,但是在编译时,dynamic类型被假定为支持任何操作,也就是说dynamic类型的对象可以是一个COM对象,也可以是一个DOM对象或者Office对象,而如果在运行时发现该对象不是期望的对象则会抛出一个运行时异常。

因为把一个对象定义为dynamic类型,所以在代码中编写的任意调用在编译时都是合法的(这一点在声明为object类型时不能成立)。例如,在控制台项目中输入以下代码,使用1.4.4节生成程序方法编译此程序,编译结果显示Build Succeeded,表明代码通过编译。

【代码解析】 第5行声明dynamic类型对象obj,并赋值。

但是按“F5”键运行后发现obj并不支持Configuration方法,因此会抛出异常,如图1-19所示。

图1-19 动态类型抛出异常

通过这个例子可以说明,C#编译器允许开发人员通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型。动态类型将使得C#可以以更加统一而便利的形式范围检查下列对象:

□ 来自动态编程语言,如Python或Ruby的对象;

□ 通过IDispatch访问的COM对象;

□ 通过反射访问的一般.NET类型;

□ 结构发生过变化的对象,如HTML DOM对象。

当开发人员得到一个动态类型的对象时,不管它是来自COM、IronPython、HTML DOM,还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮助开发人员指出针对特定的对象,这些操作的具体意义。这将给开发人员的开发带来极大的灵活性,并且能够极大程度地精简代码。

1.5.2 Visual C# 4.0命名和可选参数

Visual C# 4.0引入了命名和可选参数,命名参数和可选参数与SQL Server中的存储过程的参数十分相似。命名参数允许调用者通过提供参数的名称来为其赋值,这样参数的位置就不再重要了。可选参数允许在定义时为某些参数赋值,在调用时可以忽略这些“可选的”参数。命名参数和可选参数可以应用在方法、索引器、构造函数和委托中。命名参数和可选参数与dynamic类型结合在一起使用,可以方便地访问如Office自动化API之类的COM API。

1.命名参数

命名参数的语法为:

下面使用一个函数调用来说明命名参数。

通过以上程序可以看到由于在调用函数Check_User时使用了命名参数,参数的位置可以根据需要变更,而在以前版本中参数的位置必须和函数定义时的位置一致。

2.可选参数

方法、构造函数、索引器和委托的定义可以指定其参数为必选的还是可选的,在调用时必须提供必选参数,但是可以省略可选参数。还可以使用System.Runtime. InteropServices.Optional Attribute特性类定义可选参数,该类从1.0时代就已经包含在基类库中了。每一个可选参数的定义都包含默认值(默认值必须是常量),如果在调用时没有指定该参数,则使用默认值。下面是可选参数的例子。

在所有必需参数后面定义可选参数,如果在调用时提供了某个可选参数的值,那么必须提供该可选参数之前所有可选参数的值(如果此参数之前有可选参数),而不允许使用逗号分隔的形式提供参数。

1.5.3 Visual C# 4.0类型等价支持

开发人员可以部署一个应用程序,使之嵌入类型信息,而不是从PIA(主互操作程序集)中导入类型信息。借助于内嵌的类型信息,应用程序可以在运行时使用某种数据类型而无须要求使用对运行时程序集的引用。如果发布了运行时程序集的各种版本的话,那么,包含嵌入式类型信息的应用程序就可以直接使用各种版本的程序集工作,而不必重新进行编译。类型等价支持的使用,方便了COM API的访问。

类型嵌入经常用于COM交互,例如,使用Microsoft Office中的自动化的应用程序。嵌入类型信息允许同一个应用程序在安装了不同的Office版本的机器上运行,而且开发人员可以在完全托管解决方案中使用类型嵌入。嵌入的类型需要满足以下条件:

□ 该程序集至少提供一个公共接口;

□ 该嵌入接口使用ComImport和Guid特性声明;

□ 该程序集使用ImportedFromTypeLib和一个程序集级别的Guid特性标注(默认情况下Visual C#模版已包含了程序集的Guid特性)。

1.5.4 C# 4.0协变和逆变

Visual C# 4.0引入了协变和逆变的概念,协变功能能够支持用户使用比泛型参数更具体的类型,而逆变(contravariance)有助于使用更一般的类型。协变和逆变新概念的引入可以使实现变体接口的类进行隐式转换,从而为使用变体委托类型的方法签名匹配提供更多的灵活性。用户可以使用in和out关键字来建立变体类型的接口和委托。新的.NET框架还针对几种现有的泛型接口和委托引进了变体支持。

Visual C# 4.0中新提供了协变和逆变的新特性,一个泛型接口或委托的泛型参数被声明为协变或逆变时该接口或委托称为变体,这为解决类似于开篇中的两类问题带来了便利。.NETFramework 4.0中已为现有的一些接口和委托增加了变体支持,并且开发人员可以使用in和out关键字定义自己的变体接口和委托,但在定义时需要遵守相应的规则。

1.5.5 Office编程

Visual Studio .NET前几个版本也可以对Office进行编程操作,但是由于参数太多,类型转换复杂而烦琐,使开发人员对Office编程操作感到头痛。Visual Studio 2010中Visual C# 4.0新增加了命名和可选参数、动态类型、索引属性及可选的ref修饰符,这使得在访问COM接口(包括Office自动化相关API)方面更加方便快揵,开发Office程序更加高效。

1.5.6 多层显示(MultiMonitor)

Visual Studio 2010提供了能将IDE的窗体移动到Visual Studio IDE之外的功能,将它放至到桌面上或另一个显示器中显示。如果关闭Visual Studio,并再次打开它,会发现所有的窗体出现在最后一次放置的地方,如图1-20所示。

图1-20 Visual Studio 2010多层显示

1.5.7 代码高亮突出显示

在代码中选中一个变量时,这个变量的所有其他实例就会突出显示。这样能加速寻找变量的过程,同时也能提高代码的可读性,如图1-21所示。

图1-21 代码高亮显示 F8adVyNUIPk3t6cyDEB0h00MIE8pn5eiwXRvOJ3ZGvZKynZFtMbqkazcZgyCuyTY

点击中间区域
呼出菜单
上一章
目录
下一章
×