【學習資料】
《C#圖解教程》(第17章):https://www.cnblogs.com/moonache/p/7687551.html
電子書下載:https://pan.baidu.com/s/1mhOmBG0
【內容】
-
- 定義
- 泛型類(class)
- 泛型函數
- 泛型委托
- 多個泛型定義(T1、T2、T3)
- 泛型的約束條件(where)
【筆記】
- 定義
- 與C++中的模板template<T>一樣
- 可使用泛型的類型:類、結構、接口、委托、方法
- 注:泛型不只有一個T,可以定義多個泛型T1、T2、T3 ...
- 泛型類(class)
- 未知類型T,在創建對象時確定,這樣可以避免重載多個MyList
-
// T的類型在創建對象時確定 public class MyList<T> { private int size = 10; public T[] values; public MyList() { values = new T[size]; } } void Start() { MyList<int> myList_int = new MyList<int>(); // T 為 int MyList<string> myList_string = new MyList<string>(); // T 為 string myList_int.values[0] = 1; myList_string.values[0] = "Alice"; }
- 泛型函數
- 減少函數重載,一個泛型T適配所有不同類型的參數
-
// 交換a和b public void SwapValue<T>(ref T a, ref T b) { T temp = a; a = b; b = temp; } void Start() { int i1 = 1, i2 = 2; string s1 = "Alice", s2 = "Bob"; SwapValue(ref i1, ref i2); // T 為 int SwapValue(ref s1, ref s2); // T 為 string Debug.Log(i1); // 輸出:2 Debug.Log(s1); // 輸出:Bob }
- 泛型委托
- 與泛型類定義類似
-
// 泛型委托 delegate T NumberChanger<T>(T a, T b); public int AddNum(int a, int b) { return a + b; } public string AddString(string a, string b) { return a + b; } void Start() { // T 為 int NumberChanger<int> numberChanger_int = new NumberChanger<int>(AddNum); // T 為 string NumberChanger<string> numberChanger_string = new NumberChanger<string>(AddString); }
- 多泛型T定義
- 泛型不一定只有一個T,也可以定義多個,T1、T2、T3 ...
-
// 多泛型T委托 delegate T3 NumberChanger<T1, T2, T3>(T1 a, T2 b); // int 與 float 相加,返回string public string AddNumToString(int a, float b) { return (a + b).ToString(); } void Start() { // 創建泛型變量 NumberChanger<int, float, string> numberChanger = new NumberChanger<int, float, string>(AddNumToString); }
- 泛型的約束條件(where)
- 對泛型T進行類型約束,在定義為泛型的代碼后面加 where T: xxx ,表示T必須為xxx類型


-
- 舉例:
-
public class Major // 職業 { }; public class Teacher : Major // 教師 { } public class Person<T1, T2, T3> where T1 : class // T1 必須是個類 類型 where T2 : struct // T2 必須是個結構 類型 where T3 : Major // T3 必須是基類為Major的類 { T1 value1; T2 value2; T3 value3; } void Start() { // 報錯:T1和T3不滿足約束條件 //Person<int, int, int> person1 = new Person<int, int, int>(); // 正確: // string 類型為 class System.String // int 類型為 struct System.Int32 // Teacher 類型為 class Major Person<string, int, Teacher> person2 = new Person<string, int, Teacher>(); }
