1. 程式人生 > >2018-7-26-隨筆-泛型

2018-7-26-隨筆-泛型

() 兼容性 action 繼承關系 如果 變量 {} 就是 引用

類型不是對象,而是對象的模板

泛型不是類型,而是類型的模板

泛型:

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-隨筆-泛型