private protected キーワードの組み合わせは、メンバー アクセス修飾子です。 クラスから派生し、包含アセンブリで宣言されている型は、プライベートで保護されたメンバーにアクセスできます。
private protectedと他のアクセス修飾子の比較については、「アクセシビリティ レベル」を参照してください。
C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。
このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。
ヒント
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の 2 つのファイルが含まれています。
最初のファイルには、パブリック 基底クラス、 BaseClass、およびそこから派生した型が含 DerivedClass1。
BaseClass はプライベートで保護されたメンバー ( myValue) を所有しており、 DerivedClass1 は同じアセンブリ内の継承されたメンバーとしてアクセスできます。
2 番目のファイルでは、DerivedClass2の継承されたメンバーとしてmyValueにアクセスしようとすると、private protectedメンバーは同じアセンブリ内の派生型によってのみアクセスできるため、エラーが発生します。 この制限は、 protected (任意のアセンブリ内の派生クラスからのアクセスを許可する) と protected internal (同じアセンブリ内の任意のクラスまたは任意のアセンブリ内の派生クラスからのアクセスを許可する) との主な違いです。
Assembly1.cs
Assembly2名前を付けるInternalsVisibleToAttributeが含まれている場合、派生クラスDerivedClass2は、BaseClassで宣言されたprivate protectedメンバーにアクセスできます。
InternalsVisibleTo を使用すると、 private protected メンバーが他のアセンブリの派生クラスから参照できるようになります。
他の保護されたアクセス修飾子との比較
次の表は、3 つの保護されたアクセス修飾子の主な違いをまとめたものです。
| アクセス修飾子 | 同じアセンブリ、派生クラス | 同じアセンブリ、非派生クラス | 異なるアセンブリ、派生クラス |
|---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- アセンブリ内の派生クラスからメンバーにアクセスする場合は、
protectedを使用します。 - 最も制限の緩いアクセス権 (同じアセンブリ内の任意のクラスまたは任意の場所の派生クラス) が必要な場合は、
protected internalを使用します。 - 最も制限の厳しい保護アクセス (同じアセンブリ内の派生クラスのみ) が必要な場合は、
private protectedを使用します。
構造体 private protected 継承できないため、構造体メンバーを宣言することはできません。
C# 言語仕様
詳細については、C# 言語仕様のを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
こちらも参照ください
.NET