標籤:sp on bs new as 程式 nbsp c 方法
、泛型
在C#中可以用<>預留位置,來進行類型佔位。由於泛型佔位在編譯之後就會被替換成對應的類型,所有可以重用,比object效能要好很多。但有一個不算太大的缺點:泛型佔位在編譯時間必須確定類型(傳入或編譯器推斷)。
泛型類 1.1 泛型類中預留位置的幾種約束
a.基類約束 pulic class Hourse<T> where T:Pig 只能傳入Pig類型 b.介面約束 pulic class Hourse1<T> where T:IPig 只能傳入實現了IPig介面的類型 c.參考型別約束 pulic class Hourse2<T> where T:class 只能傳入引用類 型 d.實值型別約束 pulic class Hourse3<T> where T:struct 只能傳入實值型別 f.構造器約束 pulic class Hourse4<T> where T:new() 只能傳入能被new ()的類型 pulic class Hourse5<T> where T:class,new() -class關鍵字必須在 前面 。這種方式只能傳入能被new()的參考型別 多個預留位置的約束寫法: 每一個約束用一個where 開頭。例: pulic class Hourse6<T,V> where V:struct where T:class 1.2 泛型類的繼承 a.非泛型類繼承泛型類: 必須指定具體的父類預留位置類型 public class Son:Person<string,int> b.泛型類繼承泛型類: 如果子類要將站位符傳給父類,則必須與父類的約束保持一致 pulic class Son2<X,Y>:Person<X,Y>預留位置類型,此時子類可以不加約束 如果子類不傳遞預留位置,那麼必須為父類指定具體的 pulic calss Son3<X,Y>:Person<string,int> 1.3 封閉類型和開放類型的概念 編碼時mylist<T> 是開發類型,運行時產生的具體類是封閉類型 自己實現的泛型類 ---》開放類型 ,可以更改 程式運行時產生的泛型類--》封閉類型,不可改 泛型方法 位置:泛型方法的型別參數,可以在該方法的 形參,方法體,傳回值 1、泛型方法的預留位置的
2、泛型方法的重載條件 a.參數個數不一致 b.參數類型不一致(形參非泛型部分)c.方法類型預留位置個數不一致 3、泛型方法的重寫,注意不需要重寫約束條件 ,預設會自己添加
協變和逆變 只能用於泛型介面和泛型委派
協變: out ->代表當前預留位置只能當做傳回型別,不能當做入參類型 逆變: in ->代表當前預留位置只能當做入參類型,不能當做傳回型別
C#中的泛型