一、 引言
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);