共用方式為


私人受保護 (C# 參考)

關鍵詞 private protected 組合是成員存取修飾詞。 衍生自包含類別的型別可以存取私有受保護成員,但只能在其包含的組件內使用。 如需與其他存取修飾詞的 private protected 比較,請參閱 存取層級

備註

這個 private protected 存取修飾子在 C# 7.2 版及更新的版本中是有效的。

範例

基類的私有受保護成員只有當變數的靜態類型是衍生類別時,才能從包含它的元件中的衍生類型進行存取。 例如,請考慮下列程式代碼區段:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    private protected int myValue = 0;
}

public class DerivedClass1 : BaseClass
{
    void Access()
    {
        var baseObject = new BaseClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 5;

        // OK, accessed through the current derived class instance
        myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
    void Access()
    {
        // Error CS0122, because myValue can only be
        // accessed by types in Assembly1
        // myValue = 10;
    }
}

這個範例包含兩個檔案,分別是 Assembly1.csAssembly2.cs。 第一個檔案包含公用基類 ,BaseClass以及衍生自它的型別。 DerivedClass1 BaseClass 擁有私有受保護的成員,myValueDerivedClass1 可以在相同元件中作為繼承成員來存取。

在第二個檔案中,嘗試以 繼承成員myValue的身分存取DerivedClass2會產生錯誤,因為private protected成員只能由相同元件內的衍生型別存取。 這是與 protected (允許從任何元件中的衍生類別存取) 和 protected internal (允許從相同元件內的任何類別或任何元件中的衍生類別進行存取) 的主要差異。

如果 Assembly1.cs 包含一個命名為 InternalsVisibleToAttributeAssembly2,那麼衍生類別 DerivedClass2 將可以存取在 private protected 中宣告的 BaseClass 成員。 InternalsVisibleTo 可讓其他元件中的衍生類別看到 private protected 的成員。

與其他受保護存取修飾詞的比較

下表摘要說明三個受保護存取修飾詞之間的主要差異:

Access 修飾詞 相同元件,衍生類別 相同組件,非衍生類別 不同的組件,衍生類別
protected ✔️ ✔️
protected internal ✔️ ✔️ ✔️
private protected ✔️
  • 當您想讓任何組件中的衍生類別存取成員時,請使用protected
  • 當您想要最寬鬆的存取權時,使用 protected internal(位於同一元件中的任何類別,或在任何地方的衍生類別)
  • 當您想要限制最嚴格的受保護存取時,請使用 private protected (只有相同組件中的衍生類別)

結構的成員不能標記為 `private protected`,因為結構無法被繼承。

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法和使用方式的最終來源。

另請參閱