C# 3.0新特征之创建和初始化集合对象

2016-02-19 15:22 5 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享C# 3.0新特征之创建和初始化集合对象,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

  一、 引言

  C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单。假定你有一个类Student,它看起来有如下样子:

  

public class Student{ public string firstName; public string lastName;}

  那么,你可以使用对象初始化器来创建这个类的一个对象,如下所示:

  

var student1 = new Student{firstName = "Bruce", lastName = "Willis"};

  C# 3.0中新的集合初始化器语法也具有类似操作特征。例如,实现System.Collections.Generic.ICollection<T>的任何对象都可以使用一个集合初始化器来初始化它的值。

  一个集合初始化器由下列部分组成:

   一个对象初始化器序列,用"{"和"}"符号包括,并且由逗号隔开。

   元素初始化器,它们中每一个都指定一个元素以被添加到指定的集合对象中(元素初始化器不能是一个集合初始化器中的赋值表达式)。

  那么,究竟它是如何工作的呢?一个集合初始化器必须遵循下列规则:

   应用集合初始化器的每一个集合对象必须是一种实现了System.Collections.Generic.ICollection<T>的类型(恰好针对一个T)。

   必须存在从每一个元素初始化器到T类型的一种隐式转换。一个集合初始化器针对每一个指定的元素都会按序调用ICollection<T>.Add(T)方法。

  作为一个例子,下面的集合初始化器创建并初始化一个新的字符串集合-这个集合具有3个成员:"Alice","Bob"和"Chris",参考如下:

  

List<string> names = new List<string> { "Alice", "Bob", "Chris" };

  注意:所有的初始值都是字符串类型。否则,你将得到一个编译器错误。

  二、 实现集合初始化

  假定你想描述一个班及其中的注册同学。为此,你可以通过使用C# 3.0中的集合初始化器编程实现,如下所示:

  

using System;using System.Collections.Generic;using System.Text;using System.Query;using System.Xml.XLinq;using System.Data.DLinq;namespace CollectionInitializer{ class Program {  public class MyClass  {   public string nameofClass;   public List<string> studentNames = new List<string>();  }  static void Main(string[] args)  {   var classes = new List<MyClass>   {    new MyClass    {     nameofClass = "Science",     studentNames = {"Laura", "George"}    },    new MyClass    {     nameofClass = "Commerce",     studentNames = {"Bill", "Hillary"}    }   };  } }}

  如果你有Visual Studio 2005并且安装了LINQ Preview,那么可以在IDE中编译上面的代码。

  如果你没有VS 2005但是安装了LINQ Preview,那么你可以使用下列命令来从命令行编译该代码:

  

C:Program FilesLINQ PreviewBinCsc.exe/reference:"C:Program FilesLINQ PreviewBinSystem.Data.DLinq.dll"/reference:C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.Data.dll/reference:C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.dll/reference:"C:Program FilesLINQ PreviewBinSystem.Query.dll"/reference:C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.Xml.dll/reference:"C:Program FilesLINQ PreviewBinSystem.Xml.XLinq.dll" Program.cs

  三、 代码剖析

  让我们更细致地分析一下前面的C# 3.0代码:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

var classes = new List<MyClass>{ new MyClass {  nameofClass = "Science",  studentNames = {"Laura", "George"} }, new MyClass {  nameofClass = "Commerce",  studentNames = {"Bill", "Hillary"} }};

  对于编译器来说,它具有与下面代码相同的效果:

  

var classes = new List<MyClass>();var __c1 = new MyClass ();__c1.nameofClass = "Science";__c1.studentNames.Add("Laura");__c1.studentNames.Add("George");classes.Add(__c1);var __c2 = new MyClass();__c2.nameofClass = "Commerce";__c2.studentNames.Add("Bill");__c2.studentNames.Add("Hillary");classes.Add(__c2);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  如果激活ILDASM并且打开了编译的二进制代码形式,那么你能够看到如图1类似的内容。

  图1.示例代码片断的编译的二进制形式

  如果你双击在ILDASM中的Main结点,那么你会看到下列代码:

  

.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint //代码大小 138 (0x8a) .maxstack 3 .locals init ([0] class [mscorlib]System.Collections.Generic.List`1 <class CollectionInitializer.Program/MyClass> classes, [1] class [mscorlib]System.Collections.Generic.List`1 <class CollectionInitializer.Program/MyClass> '<tampa>f__0', [2] class CollectionInitializer.Program/MyClass '<tampa>f__1', [3] class CollectionInitializer.Program/MyClass '<tampa>f__2') IL_0000: nop IL_0001: nop IL_0002: newobj instance void class [mscorlib]System.Collections. Generic.List`1<class CollectionInitializer. Program/MyClass>::.ctor() IL_0007: stloc.1 IL_0008: ldloc.1 IL_0009: nop IL_000a: newobj instance void CollectionInitializer. Program/MyClass::.ctor() IL_000f: stloc.2 IL_0010: ldloc.2 IL_0011: ldstr "Science" IL_0016: stfld string CollectionInitializer. Program/MyClass::nameofClass IL_001b: nop IL_001c: ldloc.2 IL_001d: ldfld class [mscorlib]System.Collections.Generic.List`1 <string> CollectionInitializer. Program/MyClass::studentNames IL_0022: ldstr "Laura" IL_0027: callvirt instance void class [mscorlib]System. Collections.Generic.List`1<string>::Add(!0) IL_002c: nop IL_002d: ldloc.2 IL_002e: ldfld class [mscorlib]System.Collections.Generic.List`1 <string> CollectionInitializer. Program/MyClass::studentNames IL_0033: ldstr "George" IL_0038: callvirt instance void class [mscorlib]System.Collections. Generic.List`1<string>::Add(!0) IL_003d: nop IL_003e: nop IL_003f: ldloc.2 IL_0040: nop IL_0041: callvirt instance void class [mscorlib]System.Collections. Generic.List`1<class CollectionInitializer. Program/MyClass>::Add(!0) IL_0046: nop IL_0047: ldloc.1 IL_0048: nop IL_0049: newobj instance void CollectionInitializer. Program/MyClass::.ctor() IL_004e: stloc.3 IL_004f: ldloc.3 IL_0050: ldstr "Commerce" IL_0055: stfld string CollectionInitializer. Program/MyClass::nameofClass IL_005a: nop IL_005b: ldloc.3 IL_005c: ldfld class [mscorlib]System.Collections.Generic.List`1 <string> CollectionInitializer. Program/MyClass::studentNames IL_0061: ldstr "Bill" IL_0066: callvirt instance void class [mscorlib]System.Collections. Generic.List`1<string>::Add(!0) IL_006b: nop IL_006c: ldloc.3 IL_006d: ldfld class [mscorlib]System.Collections.Generic.List`1 <string> CollectionInitializer. Program/MyClass::studentNames IL_0072: ldstr "Hillary" IL_0077: callvirt instance void class [mscorlib]System.Collections. Generic.List`1<string>::Add(!0) IL_007c: nop IL_007d: nop IL_007e: ldloc.3 IL_007f: nop IL_0080: callvirt instance void class [mscorlib]System.Collections. Generic.List`1<class CollectionInitializer. Program/MyClass>::Add(!0) IL_0085: nop IL_0086: ldloc.1 IL_0087: nop IL_0088: stloc.0 IL_0089: ret} //Program::Main方法结束

  四、 小结

  从前面的一些代码片断中你可以看到,C# 3.0在语法方面迈出了很大的一步。

  集合初始化器,作为C# 3.0新引入的特征之一,提供了一种新的语法来初始化集合对象。这种简单的语法把集合对象的创建和初始化结合到一个步骤中。

来源:http://www.tulaoshi.com/n/20160219/1609499.html

延伸阅读
在本篇文章中,我们将讨论下面的问题: 使用C#创建一个简单的COM对象(使用COM的Interop特性)。 从VC++客户端软件中访问COM。客户端软件使用了TypeLibrary(.TLB文件)。 为了简单和方便开发人员使用、测试起见,我们使用了SQLSERVER数据库软件的缺省安装中的Northwind数据库。 修改COM对象中SQLServer的名字,与SQLSe...
标签: 电脑入门
在Windows通信端口初始化失败一般都有以下几种情况可以判断。情况如下: 1、在电脑开机之后,时间上需要六分钟左右才可以进入系统,或者更长。 2、在我们打开电脑之后,我们双击360图标的时候,电脑会提示Windows通信端口初始化失败 3、在输入命令中,输入netstat -an命令出现乱码。 4、如果是连接无线来上网的会发现无线上网也无法连接了...
标签: Web开发
为什么要初始化CSS?在webjx.com前面的文章中,我们讲过CSS初始化是指重设浏览器的样式。不同的浏览器默认的样式可能不近相同,所有开发时的第一件事可能就是如果把他们统一。 也许他们平时做页面时根本就没考虑过浏览器兼容的问题。其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异。...
ALTER DATABASE DATAFILEd:\ORANT\DATABASE\USER1ORCL.ORA RESIZE 1000M; CREATE TABLESPACE INDEX_DATA DATAFILEd:\ORANT\DATABASE\INDEX_DATA SIZE 500M; ALTER DATABASE DATAFILEd:\ORANT\DATABASE\RBS1ORCL.ORA RESIZE 300M; ALTER DATABASE DATAFILEd:\ORANT\DASTABASE\TMP1ORCL.ORA RESIZE 300M; alter rollback segment "RB1" offlin...
标签: MySQL mysql数据库
  在开发数据库应用的过程难免会编写大量的SQL语句,其中大部份是查询语句;为不同情况编写查询语句是一件很烦琐的事件。用过hibernate或Nhibernate会了解到把SQL查询语句对象化后使用起非常方便和快捷;也大大减少在编写查询SQL语句所带来的错误等问题。        前段时间在编写一个数据处理类的时候同样遇...

经验教程

860

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部