一,什么是泛型?
泛型:通過參數化類型來實現在同一份代碼上操作多種數據類型。利用“參數化類型”將類型抽象化,從而實現靈活的復用。在.NET類庫中處處都可以看到泛型的身影,尤其是數組和集合中,泛型的存在也大大提高了程序員的開發效率。
二,泛型的優點:
1>當在一個功能模塊實現就是同一種方法,而類型不同導致系統實現多次的拆箱和裝箱的操作,這將在托管堆上分配和回收大量的變量,若數據量大,則性能損失非常嚴重。 在處理引用類型時,雖然沒有裝箱和折箱操作,但將用到數據類型的強制轉換操作,增加處理器的負擔,而泛型剛好可以解決這個問題
2>使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。
3>在MSDN中用ArrayList的代碼介紹非泛型時的缺點,地址:https://msdn.microsoft.com/zh-cn/library/b5bx6xee.aspx:
在公共語言運行時和 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。 如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。 強制轉換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環訪問的情況下,裝箱和取消裝箱的影響非常明顯
三,在使用泛型處理類似情況,客戶端代碼基於每個實例指定這些類要使用的具體數據類型的方式。這樣將不再需要向上強制轉換為 T:System.Object,同時,也使得編譯器可以進行類型檢查。這樣增強了代碼的通用性和減少代碼的重復性。例子如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTdemo { //定義泛型接口 public interface ISay<T, U> where T : class { void SpeakEn(T t); void SpeakCh(U u); } //定義實體類 public class English { public string Content { get; set; } } //定義實體類 public class Chinese { public string Content { get; set; } } //定義實體類 public class English2 { public string Content { get; set; } } //定義實體類 public class Chinese2 { public string Content { get; set; } } //實現泛型接口中的方法 public class Say : ISay<English, Chinese> //繼承並實現接口 { public void SpeakEn(English en) { Console.WriteLine(en.Content); } public void SpeakCh(Chinese ch) { Console.WriteLine(ch.Content); } } //實現泛型接口中的方法2 public class Say2 : ISay<English2, Chinese2> //繼承並實現接口 { public void SpeakEn(English2 en) { Console.WriteLine(en.Content); } public void SpeakCh(Chinese2 ch) { Console.WriteLine(ch.Content); } } class Program { static void Main(string[] args) { English en = new English(); en.Content = "English"; Chinese ch = new Chinese(); ch.Content = "中文"; English2 en2 = new English2(); en2.Content = "English2"; Chinese2 ch2 = new Chinese2(); ch2.Content = "中文2"; //通過傳不同的類型實現調用不同的方法,分別調用相同接口不同類型的實現方法 ISay<English, Chinese> Is = new Say(); Is.SpeakCh(ch); Is.SpeakEn(en); ISay<English2, Chinese2> Is2 = new Say2(); Is2.SpeakCh(ch2); Is2.SpeakEn(en2); } } }
綜上:
1》與 ArrayList 相比,使用泛型就是添加的唯一語法是聲明和實例化中的類型參數,ISay<English2, Chinese2> Is2 = new Say2();而這類型參數就是你自己傳過去
2》泛型編程的思想:通過參數化類型來實現在同一份代碼上操作多種數據類型。利用“參數化類型”將類型抽象化,從而實現靈活的復用。