2018-7-26-隨筆-泛型
類型不是對象,而是對象的模板
泛型不是類型,而是類型的模板
泛型:
1.c#中的泛型只在類、結構、接口、委托、方法中有
泛型類:
創建“構造類型”===就是給”類型參數“賦予”類型實參“
泛型類的構造出的類型都是不同的並且相互獨立的
泛型的使用使得代碼減少便於維護,但是不容易寫,因為太抽象
類型參數的約束:
就是給泛型的“T”一個限定條件,讓編譯器知道什麽類型可以用什麽類型不可以用-------約束
泛型中不能處理一些類型的對象,或者不是object的派生類,否則會報錯
where語句:
約束都是用where語句列出的,多個約束就用逗號分隔。 多個where語句間沒有什麽間隔符
where語句沒有任何的次序,但是語句的內部有嚴格的順序:類名---class(引用類型)---struct(值類型)---接口名---new()(無參構造的類型)
主約束只能有一個(前三個),接口可以有多個,構造約束只能放在最後。
泛型方法:
可以在泛型和非泛型的類、接口、結構中
泛型方法也可以有約束子句,
泛型方法中如果泛型方法的方法參數和泛型參數一樣,在實例調用時就可以不用寫出泛型的實參類型
例如:
public void MyMethod <T> (T myVal){}
int myInt = 2;
MyMethon<int>(myInt);-------------正常書寫
MyMethon(myInt);----------------簡寫,推斷類型,這樣書寫編譯器可以推斷出這個方法的泛型和方法參數是一樣的,所以不用寫出來了。
泛型類和擴展方法:
理解:在使用一個類時,先定義個靜態類(static)類,在這個類中書寫一個靜態方法(static),方法的參數就是以要使用類類型,不過必須要有this關鍵字(this Holder<T> h),然後在我們實例要使用的類,就可以直接類的對象調用才寫的類方法。調用時不需要參數的,因為就是這個類型對象調用的。
泛型結構:
和泛型類一樣
泛型委托:
參數類型<形參類型,返回值類型>,也可以有約束條件
C#中的兩個泛型委托:FUNC(T,result)有返回值的 Action(T)沒有返回值的
泛型接口:
泛型的接口,要不是方法參數“泛型”,要不就是返回值”泛型“,要不就是都”泛型“
泛型接口最好是泛型類來實現,如果是非泛型類實現,就會在實現的時候寫明一個唯一的類型實參(那還定義泛型幹嘛)!!!
泛型接口名稱和非泛型接口名稱不會沖突的
實現泛型接口時要註意防止出現類型實參相同的情況,否則會出現方法一樣的情況出現報錯
協變:
派生類對象可以賦值給基類的變量這是賦值兼容性。 派生類的引用賦值給基類變量
當派生類的委托實現賦值,再把派生類的委托賦值給基類的委托,發現這個是不行的!!!!因為這是兩個委托,理論上是兩個不一樣的委托沒有什麽關系的。沒有繼承關系的,這時的賦值是不會成功的。這是的同級使得不能賦值。在泛型委托中的泛型參數中加”out“,就可以編譯成功。
這樣的只用返回值類的類型參數的皆可用派生類創建的委托類型 叫做協變
在泛型參數中用”in“,並且委托是只有泛型參數的,叫做逆變
2018-7-26-隨筆-泛型