[C#]C#學習筆記-接口,集合與泛型
C#學習筆記-接口,集合與泛型
羅朝輝(http://www.rzrgm.cn/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,泛型類可以作為其他類的基類,它可以定義許多虛方法或抽象方法,但對泛型類的派生類有一些限制:派生類必須指定一個類型參數,如果基類定義了泛型虛方法或抽象方法,派生類型必須使用指定類型參數重寫泛型方法。
浙公網安備 33010602011771號