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