アクセス修飾子 (C# プログラミング ガイド)
更新 : 2007 年 11 月
すべての型および型のメンバには、アセンブリ内の他のコードまたは他のアセンブリからそれらを使用できるかどうかを制御するアクセシビリティ レベルがあります。型またはメンバの宣言時には、次のいずれかのアクセス修飾子を使用してアクセシビリティを指定します。
public
この型またはメンバには、同じアセンブリ内の他のコードや、そのアセンブリを参照する別のアセンブリ内の任意のコードからアクセスできます。private
この型またはメンバには、同じクラスまたは同じ構造体のコードのみがアクセスできます。protected
この型またはメンバには、同じクラス、同じ構造体、または派生クラスのコードのみがアクセスできます。internal
この型またはメンバには、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。protected internal
この型またはメンバには、同じアセンブリ内の任意のコード、または別のアセンブリ内の任意の派生クラスからアクセスできます。
次の例は、型およびメンバにアクセス修飾子を指定する方法を示しています。
public class Bicycle
{
public void Pedal() { }
}
すべてのコンテキスト内のすべての型またはメンバで、すべてのアクセス修飾子を使用できるわけではありません。また、型のメンバのアクセシビリティは、その包含型のアクセシビリティによって制限される場合があります。以降のセクションでは、アクセシビリティについて詳しく説明します。
クラスと構造体のアクセシビリティ
名前空間内で直接宣言された (つまり、他のクラスや構造体に入れ子にされていない) クラスと構造体には、public または internal を指定できます。アクセス修飾子が指定されていない場合は、internal が既定値です。入れ子にされたクラスと構造体は、private として宣言することもできます。入れ子にされたプライベート型に包含型からアクセスすることはできません。
派生クラスのアクセシビリティをその基本型より高く設定することはできません。つまり、内部クラス A からパブリック クラス B を派生させることはできません。これが仮に許可されるとすると、派生クラスからは A のすべてのプロテクト メンバまたは内部メンバにアクセスできるため、結果として A がパブリックになります。
InternalsVisibleToAttribute を使用することで、他の特定のアセンブリから内部型へのアクセスを有効にできます。詳細については、「フレンド アセンブリ (C# プログラミング ガイド)」を参照してください。
クラス メンバと構造体メンバのアクセシビリティ
クラス メンバ (入れ子にされたクラスと構造体を含む) は、5 種類のうちのいずれかのアクセス修飾子を使って宣言できます。構造体は継承をサポートしていないため、構造体のメンバを protected として宣言することはできません。
メンバのアクセシビリティを、その包含型のアクセシビリティより高く設定することはできません。たとえば、内部型の中で宣言されたパブリック メソッドには、internal アクセシビリティのみが適用されます。
クラスまたは構造体のメンバがプロパティ、フィールド、メソッド、イベント、またはデリゲートであり、そのメンバが型であるか、パラメータまたは戻り値として型を持つ場合、メンバのアクセシビリティをその型より高く設定することはできません。たとえば、クラス C を返すメソッド M は、C もパブリックでない限り、パブリック メソッドにすることはできません。同様に、型 A が private として宣言されている場合、A のプロテクト プロパティを使用することはできません。
ユーザー定義の演算子は、常に public として宣言する必要があります。詳細については、「operator (C# リファレンス)」を参照してください。
デストラクタではアクセシビリティ修飾子を使用できません。
クラス メンバや構造体メンバのアクセス レベルを設定するには、適切なキーワードをメンバ宣言に追加します。次にいくつかの例を示します。
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return wheels; }
}
}
メモ : |
---|
protectedinternal アクセシビリティは、protected かつ internal ではなく、protected または internal を意味します。つまり、protectedinternal メンバには、派生クラスを含めて同じアセンブリ内のどのクラスからもアクセスできます。アクセシビリティを同じアセンブリ内の派生クラスだけに限定するには、クラス自体を internal と宣言し、そのメンバを protected と宣言します。 |
その他の型
名前空間で直接宣言されたインターフェイスは、public または internal として宣言できます。クラスや構造体と同様に、インターフェイスには既定で internal が指定されます。インターフェイスの目的は他の型からクラスや構造体にアクセスできるようにすることであるため、インターフェイス メンバは常に public です。インターフェイス メンバにはアクセス修飾子を適用できません。
列挙型メンバは常に public になり、アクセス修飾子を適用できません。
デリゲートには、既定で internal が指定されます。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
3.5 メンバ アクセス
10.3.5 アクセス修飾子