すべての型と型メンバーにアクセシビリティ レベルがあります。 アクセシビリティ レベルは、アセンブリ内の他のコードまたは他のアセンブリで使用できるかどうかを制御します。 アセンブリは、1 回のコンパイルで 1 つ以上の .cs ファイルをコンパイルすることによって作成される .dll または .exe です。 型またはメンバーにはその宣言時に、以下のアクセス修飾子を使ってアクセシビリティを指定します。
- public: 任意のアセンブリ内のコードがこの型またはメンバーにアクセスできます。 包含型のアクセシビリティ レベルによって、その型のパブリック メンバーのアクセシビリティ レベルが制御されます。
-
private: 同じ
classまたはstructで宣言されたコードのみが、このメンバーにアクセスできます。 -
protected: 同じ
classまたは派生class内のコードのみが、この型またはメンバーにアクセスできます。 - internal: 同じアセンブリ内のコードのみがこの型またはメンバーにアクセスできます。
- protected internal: 同じアセンブリ内のコード、"または" 別のアセンブリ内の派生クラス内のコードのみが、この型またはメンバーにアクセスできます。
- private protected: 同じアセンブリ内 "および" 同じクラスまたは派生クラス内のコードのみが、この型またはメンバーにアクセスできます。
最上位(入れ子でない)型にはファイル修飾子を使用します。
file修飾子は、同じソース ファイル内のコードへのアクセスを制限します。
file修飾子とアクセス修飾子を組み合わせることはできません。
型の record 修飾子により、コンパイラは追加のメンバーを合成します。
record 修飾子は、record class または record struct の既定のアクセシビリティには影響しません。
概要テーブル
| 呼び出し元の場所 | public |
protected internal |
protected |
internal |
private protected |
private |
|---|---|---|---|---|---|---|
| クラス内 | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 派生クラス (同じアセンブリ) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| 非派生クラス (同じアセンブリ) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ |
| 派生クラス (異なるアセンブリ) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| 非派生クラス (異なるアセンブリ) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
次の例は、型とメンバーにアクセス修飾子を指定する方法を示しています。
public class Bicycle
{
public void Pedal() { }
}
一部のコンテキスト、型、メンバーでは、アクセス修飾子が無効になります。 場合によっては、包含型のアクセシビリティによって、そのメンバーのアクセシビリティが制限されることがあります。
partial クラスまたは partial メンバーの複数の宣言で同じアクセシビリティにする必要があります。 1 つの宣言にアクセス修飾子が含まれていない場合、他の宣言ではアクセス修飾子を宣言できません。 部分クラスまたはメソッドの複数の宣言で異なるアクセシビリティが宣言されている場合、コンパイラはエラーを生成します。
クラスと構造体のアクセシビリティ
名前空間内で直接宣言されたクラスと構造体 (他のクラスまたは構造体内で入れ子になっていない) は、 public または internal アクセスできます。 アクセス修飾子を指定しない場合、既定値は internal です。
file修飾子を使用して、現在のソース ファイルへのアクセスを制限することもできます。
入れ子になったクラスや構造体を含む構造体メンバーは、 public、 internal、または privateとして宣言できます。 入れ子になったクラスや構造体を含むクラス メンバーは、 public、 protected internal、 protected、 internal、 private protected、または privateとして宣言できます。 既定では、入れ子になったクラスや構造体を含むクラスと構造体のメンバーは、 private アクセスできます。
派生クラスに、その基本型を超えるアクセシビリティを割り当てることはできません。 内部クラス B から派生した public クラス A を宣言することはできません。 許可される場合は、A を public にする効果が与えられるでしょう。protected のすべての internal または A メンバーに派生クラスからアクセスできるためです。
InternalsVisibleToAttribute を使用すると、internal 型へのアクセスを他の特定のアセンブリに許可できます。 詳細については、Friend アセンブリに関するページを参照してください。
その他の型
インターフェイスは、 public または internalとして名前空間内で直接宣言できます。 クラスや構造体と同様に、インターフェイスは既定でinternalアクセス レベルになります。 インターフェイスのメンバーは既定で public です。他の型がクラスや構造体にアクセスできるようにすることがインターフェイスの目的であるためです。 インターフェイス メンバー宣言には、任意のアクセス修飾子が含まれる場合があります。
interface メンバーのアクセス修飾子を使用して、インターフェイスのすべての実装者が必要とする共通の実装を提供します。
名前空間で直接宣言された delegate 型には、既定で internal アクセス権があります。
アクセス修飾子の詳細については、「アクセシビリティ レベル」ページを参照してください。
メンバーのアクセシビリティ
classまたはstruct (入れ子になったクラスと構造体を含む) のメンバーは、6 種類のアクセスのいずれかを使用して宣言できます。 構造体は継承をサポートしていないため、構造体メンバーを protected、 protected internal、または private protected として宣言することはできません。
通常、メンバーのアクセシビリティが、それを含んでいる型のアクセシビリティを超えることはありません。 ただし、メンバーがインターフェイス メソッドを実装するか、パブリック 基底クラスで定義されている仮想メソッドをオーバーライドする場合は、アセンブリの外部からpublic クラスのinternal メンバーにアクセスできます。
あらゆるメンバー フィールド、プロパティ、イベントの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。 同様に、あらゆるメソッド、インデクサー、デリゲートの戻り値の型とパラメーターの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。 たとえば、public メソッド M でクラス C を返すには、C が public にもなっている必要があります。 同様に、protected が A として宣言されている場合、A 型のプロパティを private にすることはできません。
ユーザー定義演算子は常に publicとして宣言する必要があります。 詳細については、「演算子のオーバーロード」を参照してください。
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 => _wheels;
}
アクセシビリティ修飾子をファイナライザーに割り当てることはできません。
enum型のメンバーは常にpublicされ、アクセス修飾子を適用することはできません。
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
- 修飾子の順序を指定する (スタイル規則 IDE0036)
- C# の型システム
- インターフェイス
- アクセシビリティ レベル
- 非公開
- 公共
- 内部
- 保護された
- 内部保護
- private protected(プライベート プロテクテッド)
- 密封
- クラス
- 構造体
- インターフェイス
- 匿名型
.NET