分享
 
 
 

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

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

一、 引言

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 Files\LINQ Preview\Bin\Csc.exe

/reference:"C:\Program Files\LINQ Preview\Bin\System.Data.DLinq.dll"

/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll

/reference:"C:\Program Files\LINQ Preview\Bin\System.Query.dll"

/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll

/reference:"C:\Program Files\LINQ Preview\Bin\System.Xml.XLinq.dll" Program.cs

三、 代码剖析

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

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);

如果激活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新引入的特征之一,提供了一种新的语法来初始化集合对象。这种简单的语法把集合对象的创建和初始化结合到一个步骤中。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有