国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

十一、C# 泛型

2019-11-17 02:17:08
字體:
來源:轉載
供稿:網友

十一、C# 泛型

為了促進代碼重用,尤其是算法的重用,C#支持一個名為泛型的特性。泛型與模塊類相似。泛型使算法和模式只需要實現一交。而不必為每個類型都實現一次。在實例化的時候,傳入相應的數據類型便可。注:可空值類型 也是基于泛型實現的。泛型的本質 就是給某些復雜的類型,抽象一套數據類型的別名。然后可以在這復雜類型當中使用這些別名。當運行時,可以通過為這一套抽象的數據類型指定實際的數據類型。1、概述利用泛型,可以在聲明變量時創建用來處理特定類型的特殊數據結構。程序員定義這種參數化類型,使特定泛型類型的每個變量都有相同的內部算法,但數據類型和方法簽名可以根據程序員的偏愛而不同。語法也與C++模塊相似。所以在C#中,泛型類和結構的語法要求使用相同的尖括號表示法來表示泛型聲明要處理的數據類型。2、簡單泛型類的定義在類聲明之后,需要在一對尖括號中指定一個類型參數標識符或者類型參數。

 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:        //     此元組
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尼勒克县| 广灵县| 松溪县| 英德市| 光山县| 兴仁县| 台山市| 策勒县| 方山县| 汝阳县| 台前县| 枝江市| 肇源县| 长阳| 盘锦市| 三明市| 浦东新区| 马鞍山市| 清流县| 台东市| 旬阳县| 德格县| 万源市| 云阳县| 高阳县| 乐清市| 武定县| 西藏| 高碑店市| 昭平县| 乐业县| 偏关县| 满洲里市| 宾川县| 绥芬河市| 苏尼特右旗| 深水埗区| 沙坪坝区| 都兰县| 稷山县| 西丰县|