C# 泛型
阿新 • • 發佈:2020-08-26
C#泛型(Generic)
泛型(Generic)允許延遲編寫類或方法中的程式設計元素的資料型別的規範,直到實際在程式中使用它的時候。換句話說,泛型允許編寫一個可以與任何資料型別一起工作的類或方法。
可以通過資料型別的替代引數編寫類或方法的規範。當編譯器遇到類的建構函式或方法的函式呼叫時,它會生成程式碼來處理指定的資料型別。
public static void run() { Val<string>.setVal("233"); Console.WriteLine(Val<string>.getVal()); Val<int>.setVal(114514); Console.WriteLine(Val<string>.getVal()); Console.WriteLine(Val<int>.getVal()); } class Val<T> { private static T value; public static T getVal() { return value; }public static void setVal(T v) { value = v; } }
233 233 114514
泛型(Generic)的特性
使用泛型是一種增強程式功能的技術,具體表現在以下幾個方面:
- 它有助於最大限度地重用程式碼、保護型別的安全以及提高效能。
- 可以建立泛型集合類。.NET 框架類庫在System.Collections.Generic名稱空間中包含了一些新的泛型集合類。可以使用這些泛型集合類來替代System.Collections中的集合類。
- 可以建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委託。
- 可以對泛型類進行約束以訪問特定資料型別的方法。
- 關於泛型資料型別中使用的型別的資訊可在執行時通過使用反射獲取。
泛型(Generic)方法
public static void run() { string va = "114514"; string vb = "anything"; Console.WriteLine($"va:{vb},vb:{va}"); GenericMethod.exchange<string>(ref va,ref vb); Console.WriteLine($"va:{vb},vb:{va}"); } class GenericMethod { public static void exchange<T>(ref T val1,ref T val2) { T temp = val1; val1 = val2; val2 = temp; } }
在宣告泛型方法/泛型類的時候,可以給泛型加上一定的約束來滿足我們特定的一些條件。
比如:
public class Val<T> where T:new() { }
泛型限定條件:
- T:結構(型別引數必須是值型別。可以指定除 Nullable 以外的任何值型別)
- T:類 (型別引數必須是引用型別,包括任何類、介面、委託或陣列型別)
- T:new() (型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時new() 約束必須最後指定)
- T:<基類名> 型別引數必須是指定的基類或派生自指定的基類
- T:<介面名稱> 型別引數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。
- T:U
泛型(Generic)委託
可以通過型別引數定義泛型委託。例如:
delegate T NumberChanger<T>(T n);
delegate T ValChanger<T>(T n); public static void run() { ValChanger<int> vc = new ValChanger<int>(setInt); Console.WriteLine(vc(10)); ValChanger<string> vs = new ValChanger<string>(setString); Console.WriteLine(vs("Hello World")); } public static string setString(string n) { return n +=" "+n ; } public static int setInt(int n) { return n * 2; }
20 Hello World Hello World
‘’