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

首頁 > 編程 > C# > 正文

詳解C#中的泛型以及編程中使用泛型的優點

2020-01-24 01:17:11
字體:
來源:轉載
供稿:網友

2.0 版 C# 語言和公共語言運行時 (CLR) 中增加了泛型。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方法將一個或多個類型的指定推遲到客戶端代碼聲明并實例化該類或方法的時候。例如,通過使用泛型類型參數 T,您可以編寫其他客戶端代碼能夠使用的單個類,而不致引入運行時強制轉換或裝箱操作的成本或風險,如下所示:

// Declare the generic class.public class GenericList<T>{  void Add(T input) { }}class TestGenericList{  private class ExampleClass { }  static void Main()  {    // Declare a list of type int.    GenericList<int> list1 = new GenericList<int>();    // Declare a list of type string.    GenericList<string> list2 = new GenericList<string>();    // Declare a list of type ExampleClass.    GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();  }}

泛型概述
使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。
泛型最常見的用途是創建集合類。
.NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。應盡可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList。
您可以創建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。
可以對泛型類進行約束以訪問特定數據類型的方法。
關于泛型數據類型中使用的類型的信息可在運行時通過使用反射獲取。

泛型類和泛型方法同時具備可重用性、類型安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用于集合的方法一起使用。.NET Framework 2.0 版類庫提供一個新的命名空間 System.Collections.Generic,其中包含幾個新的基于泛型的集合類。建議面向 .NET Framework 2.0 及更高版本的所有應用程序都使用新的泛型集合類,而不要使用舊的非泛型集合類如 ArrayList。

當然,也可以創建自定義泛型類型和方法,以提供自己的通用解決方案,設計類型安全的高效模式。下面的代碼示例演示一個用于演示用途的簡單泛型鏈接列表類。(大多數情況下,應使用 .NET Framework 類庫提供的 List<T> 類,而不是自行創建類。)在通常使用具體類型來指示列表中存儲的項的類型的場合,可使用類型參數 T。其使用方法如下:
在 AddHead 方法中作為方法參數的類型。
在 Node 嵌套類中作為公共方法 GetNext 和 Data 屬性的返回類型。
在嵌套類中作為私有成員數據的類型。
注意,T 可用于 Node 嵌套類。如果使用具體類型實例化 GenericList<T>(例如,作為 GenericList<int>),則所有的 T 都將被替換為 int。

// type parameter T in angle bracketspublic class GenericList<T> {  // The nested class is also generic on T.  private class Node  {    // T used in non-generic constructor.    public Node(T t)    {      next = null;      data = t;    }    private Node next;    public Node Next    {      get { return next; }      set { next = value; }    }    // T as private member data type.    private T data;    // T as return type of property.    public T Data     {      get { return data; }      set { data = value; }    }  }  private Node head;  // constructor  public GenericList()   {    head = null;  }  // T as method parameter type:  public void AddHead(T t)   {    Node n = new Node(t);    n.Next = head;    head = n;  }  public IEnumerator<T> GetEnumerator()  {    Node current = head;    while (current != null)    {      yield return current.Data;      current = current.Next;    }  }}

下面的代碼示例演示客戶端代碼如何使用泛型 GenericList<T> 類來創建整數列表。只需更改類型參數,即可方便地修改下面的代碼示例,創建字符串或任何其他自定義類型的列表:

class TestGenericList{  static void Main()  {    // int is the type argument    GenericList<int> list = new GenericList<int>();    for (int x = 0; x < 10; x++)    {      list.AddHead(x);    }    foreach (int i in list)    {      System.Console.Write(i + " ");    }    System.Console.WriteLine("/nDone");  }}

泛型的優點
在公共語言運行時和 C# 語言的早期版本中,通用化是通過在類型與通用基類型 Object 之間進行強制轉換來實現的,泛型提供了針對這種限制的解決方案。通過創建泛型類,您可以創建一個在編譯時類型安全的集合。
使用非泛型集合類的限制可以通過編寫一小段程序來演示,該程序使用 .NET Framework 類庫中的 ArrayList 集合類。 ArrayList 是一個使用起來非常方便的集合類,無需進行修改即可用來存儲任何引用或值類型。

// The .NET Framework 1.1 way to create a list:System.Collections.ArrayList list1 = new System.Collections.ArrayList();list1.Add(3);list1.Add(105);System.Collections.ArrayList list2 = new System.Collections.ArrayList();list2.Add("It is raining in Redmond.");list2.Add("It is snowing in the mountains.");

但這種方便是需要付出代價的。添加到 ArrayList 中的任何引用或值類型都將隱式地向上強制轉換為 Object。如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環訪問的情況下,裝箱和取消裝箱的影響非常明顯。
另一個限制是缺少編譯時類型檢查;因為 ArrayList 會將所有項都強制轉換為 Object,所以在編譯時無法防止客戶端代碼執行類似如下的操作:

System.Collections.ArrayList list = new System.Collections.ArrayList();// Add an integer to the list.list.Add(3);// Add a string to the list. This will compile, but may cause an error later.list.Add("It is raining in Redmond.");int t = 0;// This causes an InvalidCastException to be returned.foreach (int x in list){  t += x;}

盡管將字符串和 ints 組合在一個 ArrayList 中的做法在創建異類集合時是完全可接受的,并且有時需要有意為之,但這種做法很可能產生編程錯誤,并且直到運行時才能檢測到此錯誤。
在 C# 語言的 1.0 和 1.1 版本中,只能通過編寫自己的特定于類型的集合來避免 .NET Framework 基類庫集合類中的通用代碼的危險。當然,由于此類不可對多個數據類型重用,因此將喪失通用化的優點,并且您必須對要存儲的每個類型重新編寫該類。
ArrayList 和其他相似類真正需要的是:客戶端代碼基于每個實例指定這些類要使用的具體數據類型的方式。這樣將不再需要向上強制轉換為 T:System.Object,同時,也使得編譯器可以進行類型檢查。換句話說,ArrayList 需要一個類型參數。這正是泛型所能提供的。在 N:System.Collections.Generic 命名空間的泛型 List<T> 集合中,向集合添加項的操作類似于以下形式:

// The .NET Framework 2.0 way to create a listList<int> list1 = new List<int>();// No boxing, no casting:list1.Add(3);// Compile-time error:// list1.Add("It is raining in Redmond.");

對于客戶端代碼,與 ArrayList 相比,使用 List<T> 時添加的唯一語法是聲明和實例化中的類型參數。雖然這種方式稍微增加了編碼的復雜性,但好處是您可以創建一個比 ArrayList 更安全并且速度更快的列表,對于列表項是值類型的情況尤為如此。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲丝袜av一区| 成人精品一区二区三区| 欧美又大又粗又长| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲第一精品久久忘忧草社区| 欧美电影免费播放| 亚洲人成伊人成综合网久久久| 在线精品高清中文字幕| 久久影视电视剧免费网站清宫辞电视| 亚洲综合视频1区| 91精品国产自产在线观看永久| 成人性生交大片免费看小说| 日韩精品黄色网| 欧美精品在线看| 91九色国产视频| 亚洲免费人成在线视频观看| 在线观看欧美成人| 91经典在线视频| 国产亚洲精品成人av久久ww| 精品国产一区二区三区四区在线观看| 九九视频这里只有精品| 亚洲欧美国产精品va在线观看| 美女国内精品自产拍在线播放| 国产成人鲁鲁免费视频a| 亚洲自拍av在线| 国产在线观看一区二区三区| 91精品免费久久久久久久久| 91亚洲精品在线观看| 欧美成人免费全部| 亚洲精品美女久久久久| 亚洲精选中文字幕| 精品视频在线播放| 久久精品小视频| 国产成人精品网站| 久久久亚洲影院你懂的| 精品久久香蕉国产线看观看亚洲| 一区二区成人av| 久久影院资源网| 欧美大片欧美激情性色a∨久久| 亚洲第一精品夜夜躁人人躁| 国产国语videosex另类| 91久久综合亚洲鲁鲁五月天| 国产精品中文字幕久久久| 国产一区红桃视频| 日韩美女在线看| 欧美夫妻性生活xx| 日本高清视频一区| 国产成人97精品免费看片| 91精品久久久久久久久不口人| 亚洲国内精品视频| 亚洲综合色激情五月| 欧美性xxxxxxxxx| 亚洲影院色在线观看免费| 8x海外华人永久免费日韩内陆视频| 97视频在线观看免费高清完整版在线观看| 欧美精品生活片| 在线中文字幕日韩| 日韩黄色高清视频| 色99之美女主播在线视频| 欧美精品一区二区免费| 欧美日在线观看| 国产偷亚洲偷欧美偷精品| 亚洲精品国产美女| 亚洲第一精品久久忘忧草社区| 欧美巨猛xxxx猛交黑人97人| 亚洲人精品午夜在线观看| www.亚洲男人天堂| 成人国产精品久久久| 中文字幕亚洲天堂| 国产精品免费一区豆花| 欧美日韩国产成人在线| 亚洲成人网在线观看| 欧美性受xxxx白人性爽| 2019av中文字幕| 亚洲男人天堂九九视频| 亚洲国产精品人久久电影| 亚洲xxxx视频| 国产精品男女猛烈高潮激情| 亚洲第一天堂无码专区| 国产成人精品免高潮在线观看| 综合欧美国产视频二区| 不卡av电影院| 精品一区二区三区三区| 日韩在线观看免费高清完整版| 在线电影中文日韩| 欧美在线观看网站| 91久久中文字幕| 国产精品自拍偷拍| 欧美日韩免费看| 久久激情五月丁香伊人| 国产成人精品日本亚洲专区61| 亚洲国产黄色片| 8x海外华人永久免费日韩内陆视频| 色爱av美腿丝袜综合粉嫩av| 久久久久久国产| 91精品国产精品| 爽爽爽爽爽爽爽成人免费观看| 日韩av在线免播放器| 久久精品国产亚洲一区二区| 亚洲人成亚洲人成在线观看| 午夜欧美大片免费观看| 国产区精品在线观看| 在线观看不卡av| 日韩欧美成人区| 日韩电影中文字幕一区| 亚洲精品电影在线观看| 欧美大片va欧美在线播放| 中文字幕成人精品久久不卡| 欧美大胆在线视频| 91精品久久久久久久久久久久久| 久久国产精品影视| 欧美在线播放视频| 国产福利精品在线| 亚洲国产黄色片| 欧美性jizz18性欧美| 久久亚洲国产精品成人av秋霞| 这里精品视频免费| 热re99久久精品国产66热| 欧美亚洲在线播放| 久久99久国产精品黄毛片入口| 国产欧美日韩免费| 国产主播喷水一区二区| 日本久久久久久| 成人国产精品日本在线| 性色av香蕉一区二区| 日韩视频免费观看| 国产精品青青在线观看爽香蕉| 久久久国产精品免费| 国产精品亚洲一区二区三区| 国产精品手机播放| 亚洲国语精品自产拍在线观看| 视频在线观看一区二区| 欧美人成在线视频| 日韩欧美国产一区二区| 成年无码av片在线| 国产精品69av| 亚洲最大成人网色| 日韩av成人在线| 亚洲欧美日韩国产成人| 欧美激情奇米色| 久久青草福利网站| 91av中文字幕| 久久精品久久精品亚洲人| 大荫蒂欧美视频另类xxxx| 日韩女优人人人人射在线视频| 欧美日韩国产精品专区| 国产精品国产三级国产专播精品人| 国产区精品在线观看| 国产成人小视频在线观看| 国产精品久久久久久久天堂| 国产精品露脸av在线| 美女精品久久久| 久久久久久18| 动漫精品一区二区| 大量国产精品视频| 91视频国产一区| 78色国产精品| 午夜精品福利电影| 亚洲精品一区在线观看香蕉| 国产成人久久精品| 国产精品美女在线观看| 91日韩在线播放| 中文字幕日韩在线视频| 国产精品444|