所謂泛型,即通過引數化型別來實現在同乙份**上操作多種資料型別。
泛型程式設計是一種程式設計正規化,它利用「引數化型別」將型別抽象化,從而實現更為靈活的復用。在定義泛型類時,在對客戶端**能夠在例項化類時,可以用型別引數的型別種類施加限制。在搭建底層框架時,是最常見的程式設計方式。
泛型類範例:
namespace order.system.dal.data}}泛型類的目的是為了約束泛型方法傳引數型別或返回值型別。}return _instance;}}
}
在c# 2.0中,方法可以定義特定於其執行範圍的泛型引數,如下所示:
public class myclass即使包含類不適用泛型引數,你也可以定義方法特定的泛型引數,如下所示://此方法也可不指定方法引數
public void mymethod()
}
public class myclass注意:屬性和索引器不能指定自己的泛型引數,它們只能使用所屬類中定義的泛型引數進行操作。//此方法也可不指定方法引數
public void mymethod()
}
在呼叫泛型方法的時候,你可以提供要在呼叫場所使用的型別,如下所示:
//呼叫泛型方法
myclass myclass = new myclass();
myclass.mymethod(3);
泛型推理:
在呼叫泛型方法時,c#編譯器足夠聰明,基於傳入的引數型別來推斷出正確的型別,並且它允許完全省略型別規範,如下所示:
//泛型推理機制呼叫泛型方法
myclass myclass = new myclass();
myclass.mymethod(3);
注意:泛型方法無法只根據返回值的型別推斷出型別,**如下:
public genericmethoddemo()泛型方法中泛型引數的約束,如下:public class myclass
}
public class myclass如果客戶端**嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。}
下表列出了五種型別的約束:
約束說明
t:struct
型別引數必須是值型別。可以指定除 nullable 以外的任何值型別。
t:class
型別引數必須是引用型別,包括任何類、介面、委託或陣列型別。
t:new()
型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new() 約束必須最後指定。
t:《基類名》
型別引數必須是指定的基類或派生自指定的基類。
t:《介面名稱》
型別引數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。
t:u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。這稱為裸型別約束.
派生約束
1.常見的
public class myclass5 where t :icomparable
2.約束放在類的實際派生之後
public class b
public class myclass6 : b where t : icomparable
3.可以繼承乙個基類和多個介面,且基類在介面前面
public class b
public class myclass7 where t : b, icomparable, icloneable
建構函式約束
1.常見的
public class myclass8 where t : new()
2.可以將建構函式約束和派生約束組合起來,前提是建構函式約束出現在約束列表的最後
public class myclass8 where t : icomparable, new()
值約束
1.常見的
public class myclass9 where t : struct
2.與介面約束同時使用,在最前面(不能與基類約束,建構函式約束一起使用)
public class myclass11 where t : struct, icomparable
引用約束
常見的public class myclass10 where t : class
多個泛型引數
public class myclass12where t : icomparable where u : class
泛型 泛型類 泛型方法 泛型擦除
1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...
Dart 中泛型 泛型方法 泛型類 泛型介面
泛型就是解決類 介面 方法的復用性以及對不特定資料的支援 void main 定義乙個泛型方法 t printdata t value running dart users zhoujian dartdemo demo.dart 2zhoujian done exited with code 0 i...
泛型 (2)泛型類 泛型方法 泛型介面
一 泛型類 定義person類 package cn.itcast.p2.bean public class person implements comparable public person string name,int age public int compareto person p ov...