アクセス修飾子 (C# プログラミング ガイド)

すべての型と型メンバーにアクセシビリティ レベルがあります。 同じアセンブリまたは他のアセンブリに他のコードからそれらの型やそのメンバーを利用できるかどうかは、アクセシビリティ レベルによって制御されます。 アセンブリは、1 回のコンパイルで 1 つ以上の .cs ファイルをコンパイルすることによって作成される .dll または .exe です。 型またはメンバーにはその宣言時に、以下のアクセス修飾子を使ってアクセシビリティを指定します。

  • public:この型またはメンバーには、同じアセンブリ内の他のコードや、そのアセンブリを参照する別のアセンブリ内の任意のコードからアクセスできます。 型のパブリック メンバーのアクセシビリティ レベルは、型自体のアクセシビリティ レベルによって制御されます。
  • private:この型またはメンバーには、同じ class 内または同じ struct 内のコードからのみアクセスできます。
  • protected:この型またはメンバーには、同じ class 内のコードか、その class から派生した class 内のコードからのみアクセスできます。
  • internal:この型またはメンバーには、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。 つまり、internal の型またはメンバーには、同じコンパイルに含まれているコードからアクセスできます。
  • protected internal:この型またはメンバーには、それが宣言されているアセンブリ内の任意のコードからアクセスできるほか、別のアセンブリの派生 class 内からアクセスすることができます。
  • private protected: この型またはメンバーには、その格納アセンブリ内で宣言されている class から派生した型によってアクセスできます。

概要テーブル

呼び出し元の場所 public protected internal protected internal private protected private
クラス内 ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
派生クラス (同じアセンブリ) ✔️ ✔️ ✔️ ✔️ ✔️
非派生クラス (同じアセンブリ) ✔️ ✔️ ✔️
派生クラス (異なるアセンブリ) ✔️ ✔️ ✔️
非派生クラス (異なるアセンブリ) ✔️

次の例は、型とメンバーにアクセス修飾子を指定する方法を示しています。

public class Bicycle
{
    public void Pedal() { }
}

一部のコンテキスト、型、メンバーでは、アクセス修飾子が無効になります。 場合によっては、ある型のメンバーのアクセシビリティが、それが含まれる型のアクセシビリティによって制約されることがあります。

クラス、レコード、および構造体のアクセシビリティ

名前空間に直接宣言されている (つまり、他のクラスや構造体の入れ子にされていない) クラス、レコード、構造体には、public または internal を指定できます。 アクセス修飾子が指定されなかった場合は、既定で internal が適用されます。

構造体のメンバー (入れ子にされているクラスや構造体も含む) は publicinternalprivate のいずれかとして宣言できます。 クラスのメンバー (入れ子にされているクラスや構造体も含む) は publicprotected internalprotectedinternalprivate protectedprivate のいずれかになります。 クラスのメンバーと構造体のメンバー (入れ子にされているクラスや構造体も含む) には、既定で private のアクセスが与えられます。 入れ子にされた型のうち、private が指定されているものには、それを含んでいる型の外部からはアクセスできません。

派生クラスと派生レコードは、それらの基本データ型よりも優れたアクセシビリティにすることはできません。 内部クラス A から派生した public クラス B を宣言することはできません。 許可される場合は、A を public にする効果が与えられるでしょう。A のすべての protected または internal メンバーに派生クラスからアクセスできるためです。

InternalsVisibleToAttribute を使用すると、internal 型へのアクセスを他の特定のアセンブリに許可できます。 詳細については、Friend アセンブリに関するページを参照してください。

クラス、レコード、および構造体メンバーのアクセシビリティ

クラスおよびレコード メンバー (入れ子にされているクラス、レコード、構造体も含む) は、6 種類あるアクセス修飾子をどれでも使って宣言できます。 構造体のメンバーを protectedprotected internalprivate protected として宣言することはできません。構造体は継承をサポートしていないためです。

通常、メンバーのアクセシビリティが、それを含んでいる型のアクセシビリティを超えることはありません。 ただし、internal クラスの public メンバーには、そのアセンブリの外部からアクセスできる場合もあります。そのメンバーがインターフェイスのメソッドを実装している場合や public な基本クラスに定義されている仮想メソッドをオーバーライドしている場合がそれに該当します。

あらゆるメンバー フィールド、プロパティ、イベントの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。 同様に、あらゆるメソッド、インデクサー、デリゲートの戻り値の型とパラメーターの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。 たとえば、public メソッド M でクラス C を返すには、Cpublic にもなっている必要があります。 同様に、Aprivate として宣言されている場合、A 型のプロパティを protected にすることはできません。

ユーザー定義の演算子は、必ず publicstatic として宣言する必要があります。 詳細については、「演算子のオーバーロード」を参照してください。

アクセシビリティ修飾子をファイナライザーに割り当てることはできません。

classrecord、または struct のメンバーにアクセス レベルを設定するには、該当するキーワードをメンバーの宣言に追加します。その例を次に示します。

// 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; }
    }
}

その他の型

名前空間内に直接宣言されたインターフェイスは、public または internal にすることができます。クラスや構造体と同様、インターフェイスの既定のアクセス レベルは internal になります。 インターフェイスのメンバーは既定で public です。他の型がクラスや構造体にアクセスできるようにすることがインターフェイスの目的であるためです。 インターフェイス メンバー宣言には、あらゆるアクセス修飾子を含めることができます。 そのことは、クラスを実装するあらゆるもので必要になる共通実装を静的メソッドから与えるときに最も役に立ちます。

列挙型のメンバーは常に public となり、アクセス修飾子を適用することはできません。

デリゲートの振る舞いは、クラスおよび構造体と似ています。 既定では、名前空間内に直接宣言されているときには internal アクセスが、入れ子にされているときは private アクセスが適用されます。

C# 言語仕様

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目