一篇文章看懂C#中的協(xié)變、逆變
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) 魯迅:一張圖勝過千言萬語(圖小看不清,單機鼠標右鍵 -> 在新標簽頁中打開圖片)
備注:泛型委托的協(xié)變原理也是一樣的。
3) 什么是協(xié)變?
協(xié)變就是對具體成員的輸出參數(shù)進行一次類型轉(zhuǎn)換,且類型轉(zhuǎn)換的準則是 “里氏替換原則”。
3. 逆變(Contravariance)
1) in關(guān)鍵字
對于泛型類型參數(shù),in 關(guān)鍵字可指定類型參數(shù)是逆變的。 可以在泛型接口和委托中使用 in 關(guān)鍵字。[MSDN]
2) 魯迅:一張圖勝過千言萬語(圖小看不清,單機鼠標右鍵 -> 在新標簽頁中打開圖片)
備注:泛型委托的逆變原理也是一樣的。
3) 什么是逆變?
逆變就是對具體成員的輸入?yún)?shù)進行一次類型轉(zhuǎn)換,且類型轉(zhuǎn)換的準則是 “里氏替換原則”。
4. 自問自答
1)協(xié)變、逆變 為什么只能針對泛型接口或者委托?而不能針對泛型類?
因為它們都只能定義方法成員(接口不能定義字段),而方法成員在創(chuàng)建對象的時候是不涉及到對象內(nèi)存分配的,所以它們是類型(內(nèi)存)安全的。
為什么不針對泛型?因為泛型類是模板類,而類成員是包含字段的,不同類型的字段是影響對象內(nèi)存分配的,沒有派生關(guān)系的類型它們是不兼容的,也是內(nèi)存不安全的。
2)協(xié)變、逆變 為什么是類型安全的?
本質(zhì)上是里氏替換原則,由里氏替換原則可知:派生程度小的是派生程度大的子集,所以子類替換父類的位置整個程序功能都不會發(fā)生改變。
3)官方對 協(xié)變、逆變 的定義現(xiàn)在是否能看懂?
上面看懂了,官方定義肯定也是沒問題的。派生程度小可以理解為基類,派生程度大可以理解為子類或派生類,至于為什么用程度這個詞,是因為繼承鏈的深度是沒限制的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,謝謝大家對我們的支持。
上一篇:C#日期格式字符串的相互轉(zhuǎn)換操作實例分析
欄 目:C#教程
下一篇:C# 導(dǎo)出Excel的6種簡單方法實現(xiàn)
本文標題:一篇文章看懂C#中的協(xié)變、逆變
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4666.html
您可能感興趣的文章
- 01-10winform 實現(xiàn)控制輸入法
- 01-10C#編程自學(xué)之類和對象
- 01-10C#中深度復(fù)制和淺度復(fù)制詳解
- 01-10C#編程自學(xué)之流程控制語句
- 01-10C#影院售票系統(tǒng)畢業(yè)設(shè)計(3)
- 01-10C#影院售票系統(tǒng)畢業(yè)設(shè)計(4)
- 01-10C#實現(xiàn)帶消息數(shù)的App圖標
- 01-10C#如何實現(xiàn)圖片查看器
- 01-10談C# using的用法與好處
- 01-10C# 后臺處理圖片的幾種方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文