【c#基础】泛型
1:減少代碼的選項可以是用Object類,也可以使用泛型
但是Object類進行類型傳遞不是類型安全的。泛型類使用泛型類型保證了類型安全。
泛型類?泛型方法?泛型接口、結(jié)構(gòu)、委托
泛型優(yōu)點:
1:性能
裝箱和拆箱很容易使用,但性能損失比較大。
泛型的話在編譯的時候就會動態(tài)生成我們定義他的類型,這樣就不用進行裝箱和拆箱。
var list=new List<int>();上面這一句的話編譯的時候就會編譯成對應(yīng)的int類型了,所以在運行的時候不用在進行裝拆箱操作了。
2:類型安全
就是說你定義了一個List<int>()?這邊只能添加int類型的數(shù)據(jù)不允許你添加其他類型,向ArrayList()?就可以?同時添加int string等不同類型。這樣在調(diào)用的時候如果定義的是int類型,但是取到的是string?類型這樣運行就會報錯。
3:二進制代碼的重用
泛型允許更好的重用二進制代碼。泛型類可以定義一次,并且可以用去多不同的類型實例化。
4:代碼擴展
泛型類的定義會放在程序集中,所以用特定淚I型那個實例化泛型類不會在IL代碼中復(fù)制這些?類。
在JIT編譯器把泛型類編譯為本地代碼時,會給每個類型創(chuàng)建一個新類,引用類型共享同一個本地類的所有相同實現(xiàn)代碼,因為引用類型在實例化的泛型類中只需要4個字節(jié)內(nèi)存地址(32位系統(tǒng)),就可以引用一個類型。值類型包含在實例化的泛型類的內(nèi)存中,同時因為每個值類型對內(nèi)存要求都不同,所以要為每個值類型實例化一個新類。
?泛型命名要點:
當要給一個泛型賦默認值的時候可以使用default(T);?當是引用類型的話就會默認值為null,值類型的話默認值就是0.
協(xié)變和抗變
協(xié)變和抗變是指對參數(shù)和返回值的類型進行轉(zhuǎn)換。
參數(shù)類型協(xié)變:
例如:就是如果定義一個基類Shape和子類Rectangle,有一個方法以Sharp作為參數(shù)
但是作為shape基類的子類Rectangle可以作為參數(shù)傳遞給這個方法。
?
方法返回類型是抗變的:
當方法返回一個Shape,不能把它賦于Rectangle,因為Shape不一定總是Retangle.反過來是可行的。?
原先.Net4之前泛型是不支持協(xié)變和抗變的,之后就在支持了,但是使用方式有點不一樣
泛型類型用out關(guān)鍵字標注,泛型接口就是協(xié)變的。這意味著返回類型只能是T.
接口IIndex于類型T是協(xié)變的,并從一個自讀索引器中返回這個類型
泛型接口的抗變:
用In關(guān)鍵字標識
?泛型結(jié)構(gòu)
與類一樣,結(jié)構(gòu)也可以是泛型,只是沒有繼承特性。
泛型結(jié)構(gòu)Nullable<T>.?通常就是可空符號 ??和空合并運算符 ??
?
泛型方法也可以重載
?泛型方法所調(diào)用的方法是在編譯期間就已經(jīng)定義了,而不是運行期間。
轉(zhuǎn)載于:https://www.cnblogs.com/SignX/p/11029356.html
總結(jié)
- 上一篇: iPhone 12网络服务经常掉线是什么
- 下一篇: iOS 14.3 beta3升级内容及更