1 public class Stack<T> 2 { 3 PRivate T[] _Items; 4 5 public void Push(T data) 6 { 7 8 } 9 10 public void Pop()11 {12 13 }14 }泛型的優點:1、泛型提供了一個強類型的編程模型。它確保在參數化的類中,只有成員明確希望的數據類型才可以使用。2、編譯時類型檢查減少了在運行時發生InvalidCastException異常的幾率。3、為泛型類成員使用值類型,不再造成object的類型轉換,它們不再需要裝箱操作。4、C#中的泛型緩解了代碼膨脹的情況。5、性能得到了提高。一個原因是不再需要從object的強制轉換,從而避免了類型檢查。另一個是不再需要為值類型執行裝箱。6、泛型減少了內存消耗。由于避免了裝箱,因此減少了堆上的內存的消耗。7、代碼的可讀性更好。8、支持IntelliSense的代碼編輯器現在能直接處理來自泛型類的返回參數。沒有必要為了使IntelliSense工作起來,而對返回數據執行轉型。4、類型參數命名的指導原則和方法參數的命名相似,類型參數的命名應該盡量具有描述性。除此之外,為了強調它是一個類型參數,名稱就包含一個T前綴。5、泛型接口與structC#2.0支持在C#語言中全面地使用泛型,其中包括接口和struct。語法和類使用的語法完全相同。要定義包含類型參數的一個接口,將類型參數放到一對尖括號中即可。
1 interface ipair<T> 2 { 3 T First { get; set; } 4 T Second { get; set; } 5 } 6 public struct Pair<T> : IPair<T> 7 { 8 private T _First; 9 public T First10 {11 get12 {13 return _First;14 }15 set16 {17 _First = value;18 }19 }20 private T _Second;21 public T Second22 {23 get24 {25 return _Second;26 }27 set28 {29 _Second = value;30 }31 }32 33 34 }注:實現接口時,語法與非泛型類的語法是相同的。然而,如果實現一個泛型接口,同時不指定類型參數,會強迫類成為一個泛型類。不過此例使用了struct而不是類,表明C#支持自定義的泛型值類型。對于泛型接口的支持對于集合類來說尤其重要,使用泛型最多的地方就是集合類。假如沒有泛型,開發者就要依賴于System.Collections命名空間中的一系列接口。6、在一個類中多次實現相同的接口模塊接口造成的另一個結果是,可以使用不同的類型參數來多次實現同一個接口。
1 public interface IContainer<T> 2 { 3 ICollection<T> Items 4 { set; get; } 5 } 6 public class Address 7 { 8 } 9 public class Phone10 {11 }12 public class Email13 {14 }15 16 public class Person : IContainer<Address>, IContainer<Phone>, IContainer<Email>17 {18 ICollection<Address> IContainer<Address>.Items19 { set; get; }20 21 ICollection<Phone> IContainer<Phone>.Items22 { set; get; }23 24 ICollection<Email> IContainer<Email>.Items25 { set; get; }26 }7、構造器和終結器的定義泛型的構造器和析構器不要求添加類型參數來與類的聲明匹配。
1 2 interface IPair<T> 3 { 4 T First { get; set; } 5 T Second { get; set; } 6 } 7 public struct Pair<T> : IPair<T> 8 { 9 public Pair(T first, T second)10 {11 _First = first;12 _Second = second;13 }14 private T _First;15 public T First16 {17 get18 {19 return _First;20 }21 set22 {23 _First = value;24 }25 }26 private T _Second;27 public T Second28 {29 get30 {31 return _Second;32 }33 set34 {35 _Second = value;36 }37 }38 39 }在構造器當中,必須對所有成員變量進行初始化。因為一個成員變量在泛型中,有可能是值類型的,也有可能是引用類型的。所以需要顯式賦值。否則統一初始化null是不合適的。不過可以使用default運算符對任意數據類型的默認值進行動態編碼。
1 public Pair(T first)2 {3 _First = first;4 _Second = default(T);5 }注:default運算符允許在泛型的上下文之外使用,任何語句都可以使用它。8、多個類型參數泛型類型可以使用任意數量的類型參數,在前面的Pair<T>,只包含一個類型參數,為了存儲不同類型的兩個對象,比如一個"名稱/值"對,需要支持兩個或者更多的類型參數。
1 interface IPair<TFirst,TSecond> 2 { 3 TFirst First { get; set; } 4 TSecond Second { get; set; } 5 } 6 public struct Pair<TPFirst, TPSecond> : IPair<TPFirst, TPSecond> 7 { 8 public Pair(TPFirst first,TPSecond second) 9 {10 _First = first;11 _Second = second;12 }13 private TPFirst _First;14 public TPFirst First15 {16 get17 {18 return _First;19 }20 set21 {22 _First = value;23 }24 }25 private TPSecond _Second;26 public TPSecond Second27 {28 get29 {30 return _Second;31 }32 set33 {34 _Second = value;35 }36 } 37 38 }同樣,只需要在聲明和實例化語句的尖括號中指定多個類型參數,然后提供調用方法時與該方法的參數相匹配的類型。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 Pair<int, string> historicalEvent = new Pair<int, string>(1914, "Shackletion leaves for South Pole on ship Endurance"); 7 Console.WriteLine("{0}:{1}",historicalEvent.First,historicalEvent.Second); 8 9 10 }11 }9、元數在C#4.0中,CLR團隊定義了9個新的泛型類型,它們都叫Touple。和Pair<...>一樣,相同的名稱可以重用,因為它們的元數不同(每個類都有不同數量的類型參數)??梢酝ㄟ^元數的不同重載類型定義。
public static class Tuple { // 摘要: // 創建新的 1 元組,即單一實例。 // // 參數: // item1: // 元組僅有的分量的值。 // // 類型參數: // T1: // 元組的唯一一個分量的類型。 // // 返回結果: // 值為 (item1) 的元組。 public static Tuple<T1> Create<T1>(T1 item1); // // 摘要: // 創建新的 2 元組,即二元組。 // // 參數: // item1: // 此元組的第一個分量的值。 // // item2: // 此元組的第二個分量的值。 // // 類型參數: // T1: // 此元組的第一個分量的類型。 // // T2: // 元組的第二個分量的類型。 // // 返回結果: // 值為 (item1, item2) 的 2 元組。 public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2); // // 摘要: // 創建新的 3 元組,即三元組。 // // 參數: // item1: // 此元組的第一個分量的值。 // // item2: // 此元組的第二個分量的值。 // // item3: // 此元組的第三個分量的值。 // // 類型參數: // T1: // 此元組的第一個分量的類型。 // // T2: // 元組的第二個分量的類型。 // // T3: // 元組的第三個分量的類型。 // // 返回結果: // 值為 (item1, item2, item3) 的 3 元組。 public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3); // // 摘要: // 創建新的 4 元組,即四元組。 // // 參數: // item1: // 此元組的第一個分量的值。 // // item2: // 此元組的第二個分量的值。 // // item3: // 此元組的第三個分量的值。 // // item4: // 此元組的第四個分量的值。 // // 類型參數: // T1: // 此元組的第一個分量的類型。 // // T2: // 元組的第二個分量的類型。 // // T3: // 元組的第三個分量的類型。 // // T4: // 此元組的第四個分量的類型。 // // 返回結果: // 值為 (item1, item2, item3, item4) 的 4 元組。 public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4); // // 摘要: // 創建新的 5 元組,即五元組。 // // 參數: // item1: // 此元組的第一個分量的值。 // // item2: // 此元組的第二個分量的值。 // // item3: // 此元組
新聞熱點
疑難解答