C#3.0语言详解之基本的语言增强

C#3.0语言详解之基本的语言增强,第1张

C#3.0语言详解之基本的语言增强,第2张

Linq项目简介及开发环境的建立

9月,微软推出了一项名为“Linq Project”的新技术,用于将数据查询的功能集成在。网语。您可以从http://msdn.microsoft.com/netFramework/future/,获得Linq project的技术预览版,其中包括大量的介绍文章(英文)以及C# 3.0和VB 9.0的编译器。

Linq项目的英文全称是语言集成查询,即“语言集成查询”。Linq是基于。NET框架2.0。通过改进语言,它可以通过构造类似SQL的语句,直接在语言中查询数据源。可以查询的数据源从基本的序列结构(比如数组、链表)扩展到关系数据库(目前是SQL Server,相信以后可以扩展到几乎所有的关系数据库)和XML。

C# 3.0是C#语言的升级版,率先实现了Linq的概念;VB 9.0也用于实现Linq。从上面提到的网址,读者可以找到两种语言的编译器技术预览版。在本文中,我们将重点讨论C# 3.0的开发环境和语言改进。你得到的是一个名为“linqpiew.msi”的安装包(也可能不同)。双击后就可以像其他软件一样安装了,这里就不赘述了。此安装包为Visual Studio 2005 Beta 2和更高版本以及Visual C# 2005 Beta 2提供插件(项目模板)和C#编译器。这个编译器生成的IL代码可以直接在。NET框架2.0。安装预览版后,在新建项目对话框的项目类型列表的Visual C#节点下,我们可以看到一个Linq Preview的条目,从右边的项目模板中选择一些桌面项目模板(Linq还不支持Web项目)

只要选择了Linq中的项目模板,我们就可以像其他应用一样,开始在Visual Studio 2005中编写C# 3.0应用了。编译时,IDE会自动为我们选择C# 3.0的编译器。

现在我们可以开始编写C# 3.0应用程序,我将在下面的章节中解释C# 3.0带来的语言增强。值得注意的是,本文是系列文章之一,由三部分组成。本文是第一部分,描述C# 3.0的基本语言增强,这实际上是其他两部分的基础;第二部分会讲C# 3.0中的Lambda表达式,这是匿名方法的自然进化形式。它不仅可以将表达式体现为一个可执行的方法(delegate),还可以体现为一个可以在运行时操作的数据结构——表达式树。最后一部分是关于Linq项目最核心、最精彩的内容——查询表达式,这是Linq在C#中的实现形式。同时,Linq还扩展了。NET框架进行SQL查询和XML查询,分别叫做DLinq和XLinq。我会在其他系列文章中告诉你这些内容。

在本文的过程中,由于篇幅的限制,只提供了一小段代码而不是完整的代码。但是,这些代码片段是从可以正确编译和运行的完整代码中提取的。这些完整的代码可以从这里下载,完整的代码在本文的第5部分介绍。

好了,废话太多,我们赶紧进入C# 3.0的奇妙世界吧。

具有隐式类型的声明

在带有初始化器的声明语句中,要声明的变量的类型是显而易见的——它与初始化表达式的结果类型一致。这种情况下,在C# 3.0中,可以用新增的关键字var代替声明中的type,编译器可以根据初始化表达式推断出变量的类型。

var I = 5;//int
var d = 9.0;//double
var s = " Hello ";// string
var a = new int[] { 1,2,3,4,5 };// int[]

控制台。WriteLine("变量类型:{0} ",I . GetType());
控制台。WriteLine("变量的类型:{0} ",d . GetType());
控制台。WriteLine("变量的类型:{0} ",s . GetType());
控制台。WriteLine("变量的类型:{0} ",a . GetType());

以上代码符合C# 3.0中的语法规则,前四行代码使用隐式类型声明;最后四行代码用于在运行时验证每个变量的类型是否正确。如果您在Visual Studio 2005中运行这段代码(为了查看结果,请使用Ctrl+F5编译并启动程序),您将获得以下结果:

变量类型:系统。int 32
变量类型:System。double
变量类型:System。string
变量类型:System。Int32[]

这表明在编译时,编译器已经正确地推断出每个变量的类型,并将其嵌入到程序集的元数据中。

这里有两个限制。首先,隐式类型的声明只能作用于局部变量。第二,这样的声明必须有初始化器(即等号和下面的表达式)。如果我们试图在类中声明一个隐式类型的域,就会出现编译错误:类、结构或接口成员声明中的标记‘var’无效;如果初始值设定项没有出现在声明中,将导致另一个编译错误,应为“=”。

除了局部变量,作用域为块的数组也可以用隐式类型声明,例如:

var ia = new [] { 1,2,3,4,5 };// int[]
var da = new [] { 1.1,2,3,4,5 };//double[]
var sa = new[]{ " Hello "," World " };// string[]

控制台。WriteLine("数组的类型:{0} ",ia。GetType());
控制台。WriteLine("数组的类型:{0} ",da。GetType());
控制台。WriteLine("数组的类型:{0} ",sa。GetType());

在上述示例的数组声明中,运算符new和一对表示数组声明的方括号之间省略了类型名,但它仍然符合C# 3.0中的语法规则。编译器通过成员列表中值的类型来推断数组的类型。编译并运行上面的示例,您将获得以下输出:

数组类型:系统。int 32[]
数组类型:System。double[]
数组类型:System。字符串[]

除了具有与隐式类型的局部变量相同的约束外,隐式类型的数组必须遵守成员列表中的所有值都必须兼容的规则。也就是说,成员列表中必须有这样的值,以便其他值可以隐式转换为此值的类型。因此,下面的说法不符合语法规则:

var aa = new [] { 1,"你好",2.0,"世界" };

如果你试图编译上面的代码,你会得到一个编译错误:没有数组类型会被初始化器感染。这是因为编译器无法从成员列表中的值推断数组的类型。

事实上,虽然使用隐式类型的声明使得传统声明的编写方式更加方便,但是引入这种声明的真正目的并不是这个,而是为了让局部变量和数组能够访问这样一种新的语言构造:匿名类型。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#3.0语言详解之基本的语言增强

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情