アクセス修飾子 (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() { }
}
一部のコンテキスト、型、メンバーでは、アクセス修飾子が無効になります。 場合によっては、包含型のアクセシビリティによって、そのメンバーのアクセシビリティが制限されることがあります。
partial クラスまたは partial メンバーの複数の宣言で同じアクセシビリティにする必要があります。 partial クラスまたはメンバーの 1 つの宣言にアクセス修飾子が含まれていない場合、他の宣言ではアクセス修飾子を宣言できません。 部分クラスまたはメソッドの複数の宣言で異なるアクセシビリティが宣言されている場合、コンパイラはエラーを生成します。
クラスと構造体のアクセシビリティ
名前空間内で直接宣言されている (他のクラスまたは構造体内に入れ子にされていない) クラスと構造体には、public
、internal
、または file
のアクセスを指定できます。 アクセス修飾子が指定されなかった場合は、既定で internal
が適用されます。
構造体のメンバー (入れ子にされているクラスや構造体も含む) は public
、internal
、private
のいずれかとして宣言できます。 クラスのメンバー (入れ子にされているクラスや構造体も含む) は public
、protected internal
、protected
、internal
、private protected
、private
のいずれかになります。 クラスのメンバーと構造体のメンバー (入れ子にされているクラスや構造体も含む) には、既定で private
のアクセスが与えられます。
派生クラスに、その基本型を超えるアクセシビリティを割り当てることはできません。 内部クラス A
から派生した public クラス B
を宣言することはできません。 許可される場合は、A
を public にする効果が与えられるでしょう。A
のすべての protected
または internal
メンバーに派生クラスからアクセスできるためです。
InternalsVisibleToAttribute
を使用すると、internal 型へのアクセスを他の特定のアセンブリに許可できます。 詳細については、Friend アセンブリに関するページを参照してください。
その他の型
名前空間内に直接宣言されたインターフェイスは、public
または internal
にすることができます。クラスや構造体と同様、インターフェイスの既定のアクセス レベルは internal
になります。 インターフェイスのメンバーは既定で public
です。他の型がクラスや構造体にアクセスできるようにすることがインターフェイスの目的であるためです。 インターフェイス メンバー宣言には、任意のアクセス修飾子が含まれる場合があります。 インターフェイスのすべての実装者が必要とする共通の実装を提供するには、interface
メンバーでアクセス修飾子を使用します。
名前空間で直接宣言された delegate
型には、既定で internal
アクセス権があります。
アクセス修飾子の詳細については、「アクセシビリティ レベル」ページを参照してください。
メンバーのアクセシビリティ
class
または struct
のメンバー (入れ子にされているクラスや構造体も含む) は、6 種類のアクセスのいずれかを使用して宣言できます。 構造体のメンバーを protected
、protected internal
、private protected
として宣言することはできません。構造体は継承をサポートしていないためです。
通常、メンバーのアクセシビリティが、それを含んでいる型のアクセシビリティを超えることはありません。 ただし、internal
クラスの public
メンバーには、そのアセンブリの外部からアクセスできる場合もあります。そのメンバーがインターフェイスのメソッドを実装している場合や public 基底クラスに定義されている仮想メソッドをオーバーライドしている場合がそれに該当します。
あらゆるメンバー フィールド、プロパティ、イベントの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。 同様に、あらゆるメソッド、インデクサー、デリゲートの戻り値の型とパラメーターの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。 たとえば、public
メソッド M
でクラス C
を返すには、C
が public
にもなっている必要があります。 同様に、A
が private
として宣言されている場合、A
型のプロパティを protected
にすることはできません。
ユーザー定義の演算子は、必ず public
と static
として宣言する必要があります。 詳細については、「演算子のオーバーロード」を参照してください。
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
であり、アクセス修飾子は適用できません。
file
アクセス修飾子は、最上位 (入れ子になっていない) 型宣言でのみ許可されます。
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET