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

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

  • public: 任意のアセンブリ内のコードがこの型またはメンバーにアクセスできます。 包含型のアクセシビリティ レベルによって、その型のパブリック メンバーのアクセシビリティ レベルが制御されます。
  • private: 同じ class または struct で宣言されたコードのみが、このメンバーにアクセスできます。
  • protected: 同じ class または派生 class 内のコードのみが、この型またはメンバーにアクセスできます。
  • internal: 同じアセンブリ内のコードのみがこの型またはメンバーにアクセスできます。
  • protected internal: 同じアセンブリ内のコード、"または" 別のアセンブリ内の派生クラス内のコードのみが、この型またはメンバーにアクセスできます。
  • private protected: 同じアセンブリ内 "および" 同じクラスまたは派生クラス内のコードのみが、この型またはメンバーにアクセスできます。
  • file: 同じファイル内のコードのみが型またはメンバーにアクセスできます。

型の record 修飾子により、コンパイラは追加のメンバーを合成します。 record 修飾子は、record class または record struct の既定のアクセシビリティには影響しません。

概要テーブル

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

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

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

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

部分クラスまたは部分メソッドの一方の宣言でそのアクセシビリティが宣言されていない場合、もう一方の宣言のアクセシビリティが適用されます。 部分クラスまたはメソッドの複数の宣言で異なるアクセシビリティが宣言されている場合、コンパイラはエラーを生成します。

クラスと構造体のアクセシビリティ

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

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

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

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

その他の型

名前空間内に直接宣言されたインターフェイスは、public または internal にすることができます。クラスや構造体と同様、インターフェイスの既定のアクセス レベルは internal になります。 インターフェイスのメンバーは既定で public です。他の型がクラスや構造体にアクセスできるようにすることがインターフェイスの目的であるためです。 インターフェイス メンバー宣言には、任意のアクセス修飾子が含まれる場合があります。 インターフェイスのすべての実装者が必要とする共通の実装を提供するには、interface メンバーでアクセス修飾子を使用します。

名前空間で直接宣言された delegate 型には、既定で internal アクセス権があります。

アクセス修飾子の詳細については、「アクセシビリティ レベル」ページを参照してください。

メンバーのアクセシビリティ

class または struct のメンバー (入れ子にされているクラスや構造体も含む) は、6 種類のアクセスのいずれかを使用して宣言できます。 構造体のメンバーを protectedprotected internalprivate protected として宣言することはできません。構造体は継承をサポートしていないためです。

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

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

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

class または 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; }
    }
}

アクセシビリティ修飾子をファイナライザーに割り当てることはできません。 enum 型のメンバーは常に public であり、アクセス修飾子は適用できません。

C# 言語仕様

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

関連項目