一 泛型
泛型提供了一種更優雅的方式,可以讓多個型別共享一組代碼,泛型允許我們宣告型別引數化的代碼,可以用不同的型別進行實體化,
也就是說,我們可以用"型別占位符"來寫代碼,然后在創建類的實體時指明真實的型別,
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")) ; } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480504.html
標籤:C#
