C#學習筆記-介面,集合與泛型
羅朝輝(http://www.cnblogs.com/kesalin/)
《C#與.NET進階程式設計》讀書筆記
介面
1, 介面可以被定義為抽T象成員T的集合。介面可以包含方法,屬性,事件以及索引器。實現介面是一個要麼全要要麼全不要的問題,不能部分實現介面的方法。
2,使用 as 關鍵字擷取介面應用。
Person p = new Person("LiLai");
IStudent s = p as IStudent;
if (s != NULL)
Console.WriteLine("{0} is a student", p.Name);
else
Console.WriteLine("{0} is not a student", p.Name);
我們也可以使用 is 來判斷一個對象是否實現了某個介面:
if (p is IStudent)
....
else
...
3,介面可以如同對象一樣被當做參數,傳回值使用。
4,通過明確介面實作,解決實現多個介面的同名方法引起的命名衝突。顯式實現的成員是自動私人的,所以使用這些成員的時候必須將對象顯式轉換為對應的介面。
5,介面支援繼承,並支援多重繼承。
6,枚舉對象的構建
如果自訂類型要和C#的foreach關鍵字一起使用的話,容器就需要定義一個名為GetEnumerator()的方法,它由IEnumerator介面類型來定製。通常這個方法的實現只是交給儲存子物件的內部成員,然而,我們也可以使用yield return文法來提供多個“命名迭代器”
方法。
7,回調介面
回調介面通常不會由對擷取事件感興趣的對象直接實現,而是由一個叫做接收器對象的輔助對象來實現。事件的寄件者會在合適的情況下調用接收器。 回調介面很有點像ObjC中的 delegate。
集合和泛型
1,最基礎的容器就是 System.Array,然而我們不能在增加或刪除元素時自動調整Array的大小。我們可以利用定義在System.Collections命名空間中的介面ICollection,IComparer,IDictionary,IDictionaryEnumerator,IEnumerable,IEnumerator,IHashCodeProvider,IList等來實現更靈活的容器,或使用System.Collections.Generic命名空間的泛型容器類型Collection<T>,Comparer<T>, Dictionary<TKey, TValue>, List<T>, Queue<T>, SortedDictionary<T>, Stack<T>, LinkedList<T>, ReadOnlyCollection<T>等。
2,裝箱和撤箱
.NET平台支援兩大類的資料類型:實值型別和參考型別。簡單來說,裝箱就是把實值型別轉換為參考型別,反之就是撤箱。具體點說:裝箱就是把變數儲存在System.Object中,將實值型別顯示轉換為相應的參考型別;而撤箱就是把儲存在對象引用中的值轉換回棧上的相應實值型別。撤箱必須回到合適的資料類型,否則會引發InvalidCastException異常。
裝箱和撤箱能方便我們往容器中存取實值型別,但是也是有成本的,因為裝箱需要建立新對象,撤箱時需要銷毀對象,而且強制轉換也可能引起型別安全問題。因此我們常用泛型容器來解決此類問題。
3,C#中泛型基本使用與C++相同。C#泛型中引進了 default 關鍵字,以用於設定型別參數的預設值,數值的預設值為0,參考型別的預設值為null,一個結構的欄位被設為0或null。
4,C#中使用 where 關鍵字來約束型別參數,where 可以用來控制型別參數的各種特性,但目前還不支援運算子約束。
5,泛型類可以作為其他類的基類,它可以定義許多虛方法或抽象方法,但對泛型類的衍生類別有一些限制:衍生類別必須指定一個型別參數,如果基類定義了泛型虛方法或抽象方法,衍生類別型必須使用指定型別參數重寫泛型方法。