原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/
C#有幾個可訪問性修飾符,public、internal、internal protected和private,
- public: 具有此可訪問性宣告的成員可以在此成員所在程式集中或參考該成員所在程式集的任何其他程式集中可見,也就是說,訪問不受限制,
- internal:具有此可訪問性宣告的成員可以在此成員所在程式集中可見,但對成員所在程式集之外的任何程式集不可見,也就是說,訪問權限僅限于成員所在程式集內部,
- protected:具有此可訪問性宣告的成員可以在此成員所在程式集中包含該成員的型別的派生型別中以及此成員所在程式集之外的任何程式集中包含該成員的型別的派生型別中可見,也就是說,訪問權限僅限于包含該成員的型別及此型別的派生型別,
- internal protected:具有此可訪問性宣告的成員可以在成員所在程式集內部或外部的包含該成員的型別的派生型別內可見,也可以對成員所在程式集內的任何型別可見,也就是說,訪問權限僅限于成員所在程式集或派生型別(譯注:任意程式集),
- private:具有此可訪問性宣告的成員可以在其所在型別內可見,但對任何派生型別、同一程式集中的其他型別或所在程式集外的型別不可見,也就是說,訪問權限僅限于包含該成員的型別,
private protected
C# 7.2增加了一個新的可訪問性級別:private protected,這是為了匹配CLR中已經存在的相同的訪問級別,
- private protected:具有此可訪問性宣告的成員可以在成員所在程式集中從包含該成員的型別派生的型別中可見,它對于非派生自包含該成員的型別或成員所在程式集外部的任何型別都是不可見的,也就是說,訪問權限僅限于成員所在程式集內的包含該成員的型別及此型別的派生型別,
如果開發人員希望實作僅對內部組件級別可見的東西,這是非常有用的,
示例
為了演示private protected的行為,我創建了一個包含兩個專案的解決方案:一個是類別庫專案,另一個是參考該類別庫專案的控制臺應用程式,我在類別庫專案中創建了型別:
public class Base { protected private void M() { Console.WriteLine("From Base.M()"); } } public class D1 : Base { new public void M() { Console.WriteLine("From D1.M()"); base.M(); } }
在型別Base中,我宣告了一個private protected成員M(),然后在派生自Base的D1類中,我創建了一個方法M()并在內部呼叫base.M(),這兩種型別在同一個程式集中,所以我應該可以從D1訪問base.M(),
然后我創建另外一個型別C:
public class C { public void M() { Base b = new Base(); b.M(); D1 d = new D1(); d.M(); } }
我試圖在C.M()方法中呼叫b.M(),但是因為C沒有繼承Base,所以我沒有訪問Base.m()的權限,因此代碼無法作業;我看到這個編譯錯誤:

最后,我在控制臺程式專案中創建了一個型別,它不在Base型別所在的序集,如果我試圖在這里訪問Base.M(),我將得到這個編譯錯誤:

注意:要想重現上面的示例,你需要將你的專案升級到C# 7.2或更新版本,

結論
現在,在C# 7.2中,我們有5個級別的可訪問性:public、internal、protected、internal protected和private protected,新加入的private protected將收益于僅對所在程式集中的派生型別可訪問,以便為某些成員提供特殊的內部實作,有關更多詳細資訊,請參閱這個頁面,
系列文章:
- [譯]C# 7系列,Part 1: Value Tuples 值元組
- [譯]C# 7系列,Part 2: Async Main 異步Main方法
- [譯]C# 7系列,Part 3: Default Literals 默認文本運算式
- [譯]C# 7系列,Part 4: Discards 棄元
- [譯]C# 7系列,Part 5: private protected 訪問修飾符 (本文)
- [譯]C# 7系列,Part 6: Read-only structs 只讀結構
- [譯]C# 7系列,Part 7: ref Returns ref回傳結果
- [譯]C# 7系列,Part 8: in Parameters in引數
- [譯]C# 7系列,Part 9: ref structs ref結構
- [譯]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和統一記憶體管理 (完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/93260.html
標籤:C#
下一篇:C#界面設計相關設定
