C 3 0新特徵之建立和初始化集合物件

2021-09-22 03:26:10 字數 2756 閱讀 9095

一、 引言

c# 3.0中新的物件初始化器是一種簡單的語法特徵-借助於這種特徵,物件的構建和初始化變得非常簡單。假定你有乙個類student,它看起來有如下樣子:

public class student

那麼,你可以使用物件初始化器來建立這個類的乙個物件,如下所示:

var student1 = new student;

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

注意:所有的初始值都是字串型別。否則,你將得到乙個編譯器錯誤。

二、 實現集合初始化

假定你想描述乙個班及其中的註冊同學。為此,你可以通過使用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

static void main(string args)

},new myclass}};

}}}如果你沒有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}};

對於編譯器來說,它具有與下面**相同的效果:

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

//program::main方法結束

四、 小結

從前面的一些**片斷中你可以看到,c# 3.0在語法方面邁出了很大的一步。

集合初始化器,作為c# 3.0新引入的特徵之一,提供了一種新的語法來初始化集合物件。這種簡單的語法把集合物件的建立和初始化結合到乙個步驟中。

C 3 0新特徵之建立和初始化集合物件

一 引言 c 3.0中新的物件初始化器是一種簡單的語法特徵 借助於這種特徵,物件的構建和初始化變得非常簡單。假定你有乙個類student,它看起來有如下樣子 public class student 那麼,你可以使用物件初始化器來建立這個類的乙個物件,如下所示 var student1 new st...

C 3 0新特徵之建立和初始化集合物件

一 引言 c 3.0中新的物件初始化器是一種簡單的語法特徵 借助於這種特徵,物件的構建和初始化變得非常簡單。假定你有乙個類student,它看起來有如下樣子 public class student 那麼,你可以使用物件初始化器來建立這個類的乙個物件,如下所示 var student1 new st...

C 3 0之物件與集合初始化

我們知道在c 2.0中要初始化乙個物件可以用構造器,或者宣告公有屬性,然後在new乙個物件之後在對屬性賦值。必須一步一步的來,在c 3.0中可以有一種很簡單的方法對物件和集合進行初始化工作。看個例子 list int num newlist int 相當於 icollection.add t 即nu...