C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別
在C#中,存在兩個泛型修飾符:in和out,他們分別對應逆變委託和協變委託。
我們知道,在C#中要想將一個泛型物件轉換為另一個泛型物件時,必須要將一個泛型物件拆箱,對元素進行顯式或隱式轉換後重新裝箱。
例如:
List<Object> lobject=new List<Object>(){"0","1","2"};List<int> lint=new List<int>();foreach(Object obj in lobject){ lint.Add((int)obj);}
在這個拆箱和裝箱的過程中,要消耗掉相當於lobject物件兩倍的記憶體和資源,如果lobject物件非常大,這將是非常巨大的資源消耗。泛型修飾符就是用來解決這個問題的。
當兩個泛型物件的元素存在繼承關係是,可以在實現泛型物件是為泛型元素增加in或者out宣告,以便逆變或協變。
逆變泛型:
ListIn:IList<in T>
ListIn<Object> lobject = new ListIn<Object>(){"0","1","2"};
ListIn<int> lint=new ListIn<int>;
lint = lobject;
協變泛型:
ListOut:IList<out T>
ListOut<int> lint=new ListOut<int>(){0,1,2};
ListOut<Object> lobject=new ListOut<Object>();
lobject=lint;
相關文章
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- C#基礎:泛型委託C#泛型
- C#規範整理·泛型委託事件C#泛型事件
- C#泛型的逆變協變(個人理解)C#泛型
- 用委託者模式實現的多型別Adapter模式多型型別APT
- C#學習筆記--資料結構、泛型、委託事件等進階知識點C#筆記資料結構泛型事件
- C#學習 [型別系統] 泛型(16)C#型別泛型
- c# 委託和事件C#事件
- C#委託C#
- Python語法--可變型別和不可變型別Python型別
- iOS-關鍵字-泛型ObjectType 協變__covariant 逆變__contravariantiOS泛型Object
- c#中的委託C#
- C# - 委託與事件C#事件
- C#委託與事件C#事件
- C#的委託案例C#
- C#委託理解(1)C#
- 泛型協變與抗變(二)泛型
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- python學習之變數型別Python變數型別
- 委託
- # 委託
- solidity 引用型別修飾符memory、calldata與storage 常量修飾符Constant與Immutable區別Solid型別LDA
- 開心檔之C++ 修飾符型別C++型別
- 委託與事件-委託詳解(一)事件
- 詳解C#委託和事件(二)C#事件
- 詳解C#委託和事件(一)C#事件
- Kotlin實戰 | 2 = 12 ?泛型、類委託、過載運算子綜合應用Kotlin泛型
- 瞭解下C# 委託(Delegate)C#
- Python學習四之變數型別Python變數型別
- rust學習十一.1、泛型(通用型別)Rust泛型型別
- .NET Core CSharp初級篇 1-8泛型、逆變與協變CSharp泛型
- 型別 VS 泛型型別泛型
- TypeScript 泛型型別TypeScript泛型型別
- 使用自定義委託來呼叫Lua中的多返回值和長引數型別函式型別函式
- 事件委託事件
- C#泛型學習C#泛型
- Unity熱更學習--Lua指令碼使用C#中的事件、委託和協程Unity指令碼C#事件
- C#學習 [型別系統] 型別轉換(11)C#型別