一 泛型 泛型提供了一種更優雅的方式,可以讓多個類型共用一組代碼。泛型允許我們聲明類型參數化的代碼,可以用不同的類型進行實例化。 也就是說,我們可以用"類型占位符"來寫代碼,然後在創建類的實例時指明真實的類型。 C#提供了5種泛型:類、結構、介面、委托和方法。 二 泛型類 如下代碼聲明瞭一個Some ...
一 泛型
泛型提供了一種更優雅的方式,可以讓多個類型共用一組代碼。泛型允許我們聲明類型參數化的代碼,可以用不同的類型進行實例化。
也就是說,我們可以用"類型占位符"來寫代碼,然後在創建類的實例時指明真實的類型。
C#提供了5種泛型:類、結構、介面、委托和方法。
二 泛型類
如下代碼聲明瞭一個SomeClass的泛型類,類型參數T1和T2列在尖括弧中,當作真實類型在聲明的主體中使用。
class Program { static void Main(string[] args) { //使用泛型類聲明對象,提供short、int類型實參。 SomeClass<short, int> s1Class = new SomeClass<short, int>(); SomeClass<int, long> s2Class = new SomeClass<int, long>(); } } class SomeClass<T1, T2> where T1 : new() where T2 : new() { public T1 SomeVar = new T1(); public T2 OtherVar = new T2(); }
where是對泛型添加的約束,where T :new() 表示 類型T必須具有無參數的公共構造函數。
以下為可添加的約束類型:
約束 | 說明 |
T:struct | 類型參數必須是值類型。 |
T:class | 類型參數必須是引用類型;這一點也適用於任何類、介面、委托或數組類型。 |
T:new() | 類型參數必須具有無參數的公共構造函數。 |
T:<基類> | 類型參數必須是指定的基類或派生自指定的基類(非密封類) |
T:<介面> | 類型參數必須是指定的介面或實現指定的介面。 可以指定多個介面約束。 約束介面也可以是泛型的。 |
T:U | 為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。 |
三 泛型方法
泛型方法具有類型參數列表和可選的約束。
// <T1,T2> : 為泛型參數列表 // (T1 t1, T2 t2) : 為方法參數列表 // where T1 : Person : 為約束子句,表示T1類必須為Person類或其子類 public void PrintData<T1, T2>(T1 t1, T2 t2) where T1 : Person { ... }
調用泛型方法,應該在方法調用時提供類型實參。
下列是泛型方法的使用實例:
static public void ReverseAndPrint<T>(T[] arr) { Array.Reverse(arr); foreach (var item in arr) { Console.WriteLine(item); } } static void Main(string[] args) { var intArr = new int[] { 1, 2, 3, 4, 5 }; var strArr = new string[] { "a", "b", "c", "d", "e" }; ReverseAndPrint<int>(intArr); //調用泛型方法 ReverseAndPrint(intArr); //推斷類型並調用 ReverseAndPrint<string>(strArr); ReverseAndPrint(strArr); }
四 泛型結構
與泛型類類似,泛型結構也可以有類型參數和約束。泛型結構的規則與條件與泛型類是一樣的。
五 泛型委托
泛型委托和非泛型委托非常類似,不過類型參數決定了能接受什麼樣的方法。
// <T, R> : 為類型參數 // (T value) : 為委托形參 // R : 返回類型 delegate R MyDelegate<T, R>(T value);
下麵是一個泛型委托的示例:
delegate void MyDelegate<T>(T value); //泛型委托 class Simple { public static void PrintString(string s) { Console.WriteLine(s); } public static void PrintUpperString(string s) { Console.WriteLine(s.ToUpper()); } } static void Main(string[] args) { var myDel = new MyDelegate<string>(Simple.PrintString); myDel += Simple.PrintUpperString; myDel("hello world"); }
六 泛型介面
泛型介面允許我們編寫參數和介面成員返回類型是泛型類型參數的介面。
下麵是泛型介面的示例:
interface IMyIfc<T> { T ReturnIt(T inValue); } class Simple : IMyIfc<int>, IMyIfc<string> { public int ReturnIt(int inValue) { return inValue; } public string ReturnIt(string inValue) { return inValue; } } class Program { static void Main(string[] args) { var sim = new Simple(); Console.WriteLine(sim.ReturnIt(5)); Console.WriteLine(sim.ReturnIt("hello world")) ; } }