您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C#中的協(xié)變和逆變是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1. 基本概念
官方:協(xié)變和逆變都是術(shù)語,前者指能夠使用比原始指定的派生類型的派生程度更大(更具體的)的類型,后者指能夠使用比原始指定的派生類型的派生程度更?。ú惶唧w的)的類型。[MSDN]
公式:
協(xié)變:IFoo<父類> = IFoo<子類>;
逆變:IBar<子類> = IBar<父類>;
暫時不理解沒關(guān)系,您接著往下看。
2. 協(xié)變(Covariance)
1) out關(guān)鍵字
對于泛型類型參數(shù),out 關(guān)鍵字可指定類型參數(shù)是協(xié)變的。 可以在泛型接口和委托中使用 out 關(guān)鍵字。[MSDN]
2) 魯迅:一張圖勝過千言萬語(圖小看不清,單機(jī)鼠標(biāo)右鍵 -> 在新標(biāo)簽頁中打開圖片)
備注:泛型委托的協(xié)變原理也是一樣的。
3) 什么是協(xié)變?
協(xié)變就是對具體成員的輸出參數(shù)進(jìn)行一次類型轉(zhuǎn)換,且類型轉(zhuǎn)換的準(zhǔn)則是 “里氏替換原則”。
3. 逆變(Contravariance)
1) in關(guān)鍵字
對于泛型類型參數(shù),in 關(guān)鍵字可指定類型參數(shù)是逆變的。 可以在泛型接口和委托中使用 in 關(guān)鍵字。[MSDN]
2) 魯迅:一張圖勝過千言萬語(圖小看不清,單機(jī)鼠標(biāo)右鍵 -> 在新標(biāo)簽頁中打開圖片)
備注:泛型委托的逆變原理也是一樣的。
3) 什么是逆變?
逆變就是對具體成員的輸入?yún)?shù)進(jìn)行一次類型轉(zhuǎn)換,且類型轉(zhuǎn)換的準(zhǔn)則是 “里氏替換原則”。
4. 自問自答
1)協(xié)變、逆變 為什么只能針對泛型接口或者委托?而不能針對泛型類?
因為它們都只能定義方法成員(接口不能定義字段),而方法成員在創(chuàng)建對象的時候是不涉及到對象內(nèi)存分配的,所以它們是類型(內(nèi)存)安全的。
為什么不針對泛型?因為泛型類是模板類,而類成員是包含字段的,不同類型的字段是影響對象內(nèi)存分配的,沒有派生關(guān)系的類型它們是不兼容的,也是內(nèi)存不安全的。
2)協(xié)變、逆變 為什么是類型安全的?
本質(zhì)上是里氏替換原則,由里氏替換原則可知:派生程度小的是派生程度大的子集,所以子類替換父類的位置整個程序功能都不會發(fā)生改變。
3)官方對 協(xié)變、逆變 的定義現(xiàn)在是否能看懂?
上面看懂了,官方定義肯定也是沒問題的。派生程度小可以理解為基類,派生程度大可以理解為子類或派生類,至于為什么用程度這個詞,是因為繼承鏈的深度是沒限制的。
“C#中的協(xié)變和逆變是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。