關鍵詞 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.cs 和 Assembly2.cs。
第一個檔案包含公用基類 ,BaseClass以及衍生自它的型別。 DerivedClass1
BaseClass 擁有私有受保護的成員,myValue,DerivedClass1 可以在相同元件中作為繼承成員來存取。
在第二個檔案中,嘗試以 繼承成員myValue的身分存取DerivedClass2會產生錯誤,因為private protected成員只能由相同元件內的衍生型別存取。 這是與 protected (允許從任何元件中的衍生類別存取) 和 protected internal (允許從相同元件內的任何類別或任何元件中的衍生類別進行存取) 的主要差異。
如果 Assembly1.cs 包含一個命名為 InternalsVisibleToAttribute 的 Assembly2,那麼衍生類別 DerivedClass2 將可以存取在 private protected 中宣告的 BaseClass 成員。
InternalsVisibleTo 可讓其他元件中的衍生類別看到 private protected 的成員。
與其他受保護存取修飾詞的比較
下表摘要說明三個受保護存取修飾詞之間的主要差異:
| Access 修飾詞 | 相同元件,衍生類別 | 相同組件,非衍生類別 | 不同的組件,衍生類別 |
|---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- 當您想讓任何組件中的衍生類別存取成員時,請使用
protected - 當您想要最寬鬆的存取權時,使用
protected internal(位於同一元件中的任何類別,或在任何地方的衍生類別) - 當您想要限制最嚴格的受保護存取時,請使用
private protected(只有相同組件中的衍生類別)
結構的成員不能標記為 `private protected`,因為結構無法被繼承。
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法和使用方式的最終來源。