三、將對象初始值設定項用於匿名類型
查詢表達式經常使用匿名類型,而這些類型只能使用對象初始值設定項進行初始化。如:
MyClass[] ojbset = new MyClass[12];
var vaobj =
from obj in ojbset
select new { obj.Name, obj.Number };
也就是說,把obJSet中的每一個obj的Name屬性和Number屬性拿來,new成新隱式類型,賦值給vaobj,這種新類型的屬性名也被省略掉了,那實際上,其屬性名就是Name和Nnumber,值分別是它們兩者的值。這個方式呢,由於new { obj.Name,obj.Number };這句是new的一個新的隱式類型,與類MyClass沒有關系,所以,MyClass沒有無參構造函數也是可以的。而如果要在new隱式類型的時候,重新命名其屬性,則可以采用如下方式:
var varobj =
from vobj in ojbset
select new { vobj.Name, ID = vobj.Number };
四、集合初始值設定項
集合初始值設定項,也叫集合初始化器,會對初始化器中的元素進行按序調用ICollection<T>.Add(T) 。使用集合初始值設定項的對象的類型必須實現了System.Collections.Generic.ICollections<T>接口並指定了確定的T。使用它可以在初始化一個實現了IEnumerable的集合類時指定一個或多個元素初始值;
元素初始值設定項可以是簡單的值,也可以是表達式或對象初始值設定項;
通過使用集合初始值設定項,無需在源代碼中指定多個對該類的Add 方法的調用;編譯器會添加這些調用。
例子如下:
public void setinit()
{
List<int> digits = new List<int> {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
};
List<int> digits2 = new List<int> {
0 + 1, 12 % 3, getIntNumber()
};
List<MyClass> customers = new List<MyClass>{
new MyClass{Number="1111",Name="yy"},
new MyClass{Number="2222",Name="QQ"},
new MyClass{Number="3333",Name="qiqi"}
};
}
public int getIntNumber()
{
return 56;
}
這和以前調用List.Add沒有本質的區別,編譯器自動的調用了List的無參構造方法,然後實例化一個個的MyClass,再一個個的Add進去,和我們原來的做法沒有什麼不同,但是,這是編譯器在後台自動處理,簡省了我們很多的編碼工作。
注:
各項之間還是用逗號,結束了,花括號後邊表示new這個集合結束,用分號。
如果集合的Add 方法允許,可以將null 指定為集合初始值設定項中的一個元素。如:
List<MyClass> customers = new List<MyClass>{
new MyClass{Number="1111",Name="yy"},
new MyClass{Number="2222",Name="QQ"},
new MyClass{Number="3333",Name="qiqi"},
null
};
五、總結
這些新特性平常怕是很少用到的,因為已經習慣了C# 2.0的寫法,而且,這樣寫又不是必須的。但真正熟悉了,編譯器已經幫開發人員做了越類越多的工作,從而節約了我們的開發時間。或許,在其它的應用當中,這樣的語法還能用的到吧。