泛型概述
C# 泛型稱之為型別參數。泛型要點:
- 在定義方法中,通常是將變數的值作為參數,但其實這個變數的類型本身也可以作為參數。
- 泛型允許在調用的時候再指定這個型別參數是什麼。
- 在.net中,泛型能夠給我們帶來的三個明顯好處是:型別安全、代碼重用、減少裝箱和拆箱操作。
- 通過泛型可以定義型別安全類,而不會損害型別安全、效能或工作效率。
- 可以用任何類型來聲明和使用它。
- 使用 ﹤ 和 ﹥ 括弧,以便將一般型別參數括起來。
泛型的幾個好處執行個體:
public class 泛型 { //非泛型:類型不安全-編譯時間不能發現錯誤 //執行提示:System.InvalidCastException: 指定的轉換無效。 public void ShowValues1() { ArrayList list = new ArrayList(); list.Add(44); list.Add("string"); //編譯通過 foreach (int i in list) { Console.WriteLine("輸出值:" + i); } } //泛型:型別安全-編譯時間即發現類型不符 public void ShowValues2() { List<string> list = new List<string>(); list.Add(44); //--編譯出錯 list.Add("string"); foreach (string s in list) { Console.WriteLine("輸出值:" + s); } } //非泛型:需要顯式類型轉換,損失效能 public void ShowValues3() { ArrayList list = new ArrayList(); list.Add(44); int i = (int)list[0]; Console.WriteLine("輸出值:" + i); } //泛型:使用時類型是確定的,無需進行類型轉換 public void ShowValues4() { List<int> list = new List<int>(); list.Add(44); int i = list[0]; Console.WriteLine("輸出值:" + i); } }
自訂泛型,及調用。從中可以看出泛型在代碼重用中的作用。
//自訂一個泛型類 public class MyGeneric<T> { public void ShowValues(T a) { Console.WriteLine("輸出值:" + a.ToString()); } } //用不同的型別參數調用自訂泛型 public class Test_MyGeneric { public void Test_int_ShowValues() { MyGeneric<int> fanXing = new MyGeneric<int>(); fanXing.ShowValues(100); } public void Test_string_ShowValues() { MyGeneric<string> fanXing = new MyGeneric<string>(); fanXing.ShowValues("Hello"); } public void Test_doube_ShowValues() { MyGeneric<double> fanXing = new MyGeneric<double>(); fanXing.ShowValues(3.14); } //定義泛型方法:交換兩個變數 public void Swap<T>(ref T a, ref T b) { T temp; temp = a; a = b; b = temp; } //交換整數 public void TestSwap1() { int t = 1; int g = 2; Swap(ref t, ref g); Console.WriteLine("輸出值t:" + t.ToString()); Console.WriteLine("輸出值g:" + g.ToString()); } //交換字串 public void TestSwap2() { string t = "str1"; string g = "str2"; Swap(ref t, ref g); Console.WriteLine("輸出值t:" + t.ToString()); Console.WriteLine("輸出值g:" + g.ToString()); } //交換對象 public class usrEntity { public string username { get; set; } public string sex { get; set; } } public void TestSwap3() { usrEntity t = new usrEntity(){ username = "小明", sex = "男" }; usrEntity g = new usrEntity() { username = "小紅", sex = "女" }; Swap(ref t, ref g); Console.WriteLine("輸出值t:" + t.username + ":" + t.sex); Console.WriteLine("輸出值g:" + g.username + ":" + g.sex); } }
注意:本文根據相關培訓資料整理而成。