亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

十一、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:        //     此元組
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品91视频| 久久精品中文字幕一区| 国产精品久久久久免费a∨大胸| 国产精品露脸自拍| 色偷偷888欧美精品久久久| 欧美肥婆姓交大片| 亚洲无av在线中文字幕| 久久成人综合视频| 欧美大片第1页| 日韩av网站电影| 亚洲精品美女视频| 亚洲xxxx在线| 欧美日韩亚洲视频一区| 国产日韩欧美电影在线观看| 亚洲人免费视频| 欧美www视频在线观看| 日韩成人黄色av| 91香蕉嫩草神马影院在线观看| 精品在线欧美视频| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩国产在线播放| 久久影院资源网| 亚洲国产成人爱av在线播放| 欧美午夜片在线免费观看| 日韩欧美国产视频| 国产精品视频最多的网站| 亚洲最大福利网站| 精品一区二区亚洲| 亚洲美女黄色片| 国产精品久久久久久搜索| 国产精品一区=区| 国产偷国产偷亚洲清高网站| 亚洲美女动态图120秒| 日韩视频免费大全中文字幕| 精品视频中文字幕| 日韩精品久久久久久久玫瑰园| 国产一区二区在线免费视频| 欧美超级免费视 在线| 欧美激情成人在线视频| 欧美成人激情在线| 亚洲国产天堂久久国产91| 国产精品日韩欧美综合| 97在线视频免费看| 日韩美女免费线视频| 海角国产乱辈乱精品视频| 国产精品三级美女白浆呻吟| 亚洲欧洲激情在线| 2019亚洲男人天堂| www.久久色.com| 国产亚洲欧美日韩美女| 欧美亚洲成人免费| 精品免费在线观看| 91在线观看免费高清完整版在线观看| 久久久国产91| www.久久草.com| 成人亚洲激情网| 97欧美精品一区二区三区| 亚洲日本中文字幕| 亚洲福利在线看| 亚洲第一精品夜夜躁人人爽| 国产欧美精品xxxx另类| 久久婷婷国产麻豆91天堂| 91高清视频在线免费观看| 亚洲aⅴ日韩av电影在线观看| 日韩在线观看电影| 久久av红桃一区二区小说| 国产成人精品优优av| 成人性生交xxxxx网站| 不卡av电影在线观看| 国产精品日韩欧美| 日韩亚洲国产中文字幕| 欧美精品成人在线| 91大神在线播放精品| 51ⅴ精品国产91久久久久久| 人人爽久久涩噜噜噜网站| 成人久久久久爱| 日韩中文理论片| 成人精品网站在线观看| 57pao国产精品一区| 国产精品福利无圣光在线一区| 一区二区三区久久精品| 欧美日韩亚洲91| 欧美国产日本高清在线| 久久中文字幕在线| 亚洲精品美女久久| 91免费综合在线| 久久久精品电影| 国产成人精品免费久久久久| 国产精品丝袜一区二区三区| 久久精品国产欧美亚洲人人爽| 91在线|亚洲| 亚洲日韩欧美视频一区| 黑人狂躁日本妞一区二区三区| 激情成人在线视频| 亚洲无限乱码一二三四麻| 日本伊人精品一区二区三区介绍| 欧美高清性猛交| 久久亚洲精品一区二区| 91视频免费在线| 欧美在线国产精品| 久久国产精品网站| 日韩欧美一区二区三区| 欧洲精品久久久| 精品国产一区二区在线| 亚洲欧美中文字幕在线一区| 97欧美精品一区二区三区| 久久夜色撩人精品| 亚洲娇小xxxx欧美娇小| 国内伊人久久久久久网站视频| 欧美福利小视频| 久久亚洲电影天堂| 日韩视频中文字幕| 91精品久久久久久综合乱菊| 久久久人成影片一区二区三区观看| 亚洲欧美成人在线| 国产精品1区2区在线观看| 欧美高清videos高潮hd| 懂色av中文一区二区三区天美| 亚洲精品国产免费| 97精品在线观看| 欧美区二区三区| 欧美精品激情在线| 国产精欧美一区二区三区| 日韩电影在线观看免费| 国产精品国内视频| 亚洲自拍偷拍福利| 日韩欧美在线观看| 在线播放日韩专区| 亚洲成人黄色网| 国产激情久久久| 欧美激情精品久久久久久久变态| 中文字幕日韩有码| 国产精品视频网| 91精品在线一区| 欧美在线性爱视频| 成人久久精品视频| 亚洲国产天堂网精品网站| 成人激情视频在线| 国产在线一区二区三区| 亚洲国产精品久久| 亚洲最大福利网站| 国产成人拍精品视频午夜网站| 成人精品视频在线| 久久视频国产精品免费视频在线| 欧洲中文字幕国产精品| 97久久精品人人澡人人爽缅北| 久久视频在线直播| 国产日韩在线一区| 国产精品观看在线亚洲人成网| 日韩av电影在线免费播放| 97视频在线观看网址| 欧美亚洲另类在线| 狠狠躁夜夜躁久久躁别揉| 成人h视频在线| 欧美视频在线观看免费| 久久精品电影网站| 国产亚洲精品美女久久久| 久久精品国产免费观看| 欧美诱惑福利视频| 国产精品欧美激情在线播放| 91精品综合视频| 成人免费xxxxx在线观看| 欧美亚洲在线播放| 热99在线视频|