關鍵詞 private protected 組合是成員存取修飾詞。 從類別衍生且在包含的assembly中宣告的類型可以存取私有保護成員。 如需與其他存取修飾詞的 private protected 比較,請參閱 存取層級。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
派生型別只有在變數的靜態型態是派生類別型別時,才能存取基底類別的私有保護成員。 例如,請考慮下列程式代碼區段:
// 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 可以在相同元件中作為繼承成員來存取。
在第二個檔案中,嘗試以繼承成員DerivedClass2的身份存取myValue會產生錯誤,因為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# 語法和使用方式的最終來源。