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

すべての型とそのメンバーには、アクセシビリティ レベルがあります。同じアセンブリ (または他のアセンブリ) にある他のコードからそれらの型やそのメンバーを利用できるかどうかは、アクセシビリティ レベルによって制御されます。All types and type members have an accessibility level, which controls whether they can be used from other code in your assembly or other assemblies. 型またはメンバーにはその宣言時に、以下のアクセス修飾子を使ってアクセシビリティを指定できます。You can use the following access modifiers to specify the accessibility of a type or member when you declare it:

publicpublic
この型またはメンバーには、同じアセンブリ内の他のコードや、そのアセンブリを参照する別のアセンブリ内の任意のコードからアクセスできます。The type or member can be accessed by any other code in the same assembly or another assembly that references it.

privateprivate
この型またはメンバーには、同じクラス内または同じ構造体内のコードからのみアクセスできます。The type or member can be accessed only by code in the same class or struct.

protectedprotected
この型またはメンバーには、同じクラス内のコードか、そのクラスから派生したクラス内のコードからのみアクセスできます。The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
internalinternal
この型またはメンバーには、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。The type or member can be accessed by any code in the same assembly, but not from another assembly.

protected internal この型またはメンバーには、それが宣言されているアセンブリ内の任意のコードからアクセスできるほか、別のアセンブリの派生クラス内からアクセスすることができます。protected internal The type or member can be accessed by any code in the assembly in which it is declared, or from within a derived class in another assembly.

private protected この型またはメンバーには、同じクラスのコードか、そのクラスから派生した型のコードによって、その宣言アセンブリ内でのみ、アクセスできます。private protected The type or member can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class.

次の例は、型とメンバーにアクセス修飾子を指定する方法を示しています。The following examples demonstrate how to specify access modifiers on a type and member:

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

コンテキストに関係なくすべての型またはすべてのメンバーにどのようなアクセス修飾子でも使用できるというわけではありません。型のメンバーのアクセシビリティが、それを含んでいる型のアクセシビリティによって制約を受ける場合もあります。Not all access modifiers can be used by all types or members in all contexts, and in some cases the accessibility of a type member is constrained by the accessibility of its containing type. 以降のセクションでは、アクセシビリティについてさらに詳しく取り上げます。The following sections provide more details about accessibility.

クラスと構造体のアクセシビリティClass and Struct Accessibility

名前空間に直接宣言されている (つまり、他のクラスや構造体の入れ子にされていない) クラスと構造体には、public または internal を指定することができます。Classes and structs that are declared directly within a namespace (in other words, that are not nested within other classes or structs) can be either public or internal. アクセス修飾子が指定されなかった場合は、既定で internal が適用されます。Internal is the default if no access modifier is specified.

構造体のメンバー (入れ子にされているクラスや構造体も含む) は public、internal、private のいずれかとして宣言することができます。Struct members, including nested classes and structs, can be declared as public, internal, or private. クラスのメンバー (入れ子にされているクラスや構造体も含む) は public、protected internal、protected、internal、private protected、private のいずれかとして宣言することができます。Class members, including nested classes and structs, can be public, protected internal, protected, internal, private protected or private. クラスのメンバーと構造体のメンバー (入れ子にされているクラスや構造体も含む) には、既定で private のアクセス レベルが指定されます。The access level for class members and struct members, including nested classes and structs, is private by default. 入れ子にされた型のうち、private が指定されているものには、それを含んでいる型の外部からはアクセスできません。Private nested types are not accessible from outside the containing type.

派生クラスに、その基本型を超えるアクセシビリティを割り当てることはできません。Derived classes cannot have greater accessibility than their base types. つまり、internal クラス A から派生したクラス B を public にすることはできません。In other words, you cannot have a public class B that derives from an internal class A. 仮にそれが許容されるならば、A が public になると考えられます。A のすべての protected メンバーと internal メンバーに派生クラスからアクセスできることになるからです。If this were allowed, it would have the effect of making A public, because all protected or internal members of A are accessible from the derived class.

InternalsVisibleToAttribute を使うと、internal 型へのアクセスを他の特定のアセンブリに許可することができます。You can enable specific other assemblies to access your internal types by using the InternalsVisibleToAttribute. 詳細については、Friend アセンブリに関するページを参照してください。For more information, see Friend Assemblies.

クラスと構造体のメンバーのアクセシビリティClass and Struct Member Accessibility

クラスのメンバー (入れ子にされているクラスや構造体も含む) は、6 種類あるアクセス修飾子をどれでも使って宣言できます。Class members (including nested classes and structs) can be declared with any of the six types of access. 構造体のメンバーを protected として宣言することはできません。構造体は継承をサポートしていないためです。Struct members cannot be declared as protected because structs do not support inheritance.

通常、メンバーのアクセシビリティが、それを含んでいる型のアクセシビリティを超えることはありません。Normally, the accessibility of a member is not greater than the accessibility of the type that contains it. ただし、internal クラスの public メンバーには、そのアセンブリの外部からアクセスできる場合もあります。そのメンバーがインターフェイスのメソッドを実装している場合や public な基本クラスに定義されている仮想メソッドをオーバーライドしている場合がそれに該当します。However, a public member of an internal class might be accessible from outside the assembly if the member implements interface methods or overrides virtual methods that are defined in a public base class.

フィールド、プロパティ、イベントのいずれかに該当するメンバーの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。The type of any member that is a field, property, or event must be at least as accessible as the member itself. 同様に、メソッド、インデクサー、デリゲートのいずれかに該当するメンバーの戻り値の型とパラメーターの型には、メンバー自体と同じかそれ以上のアクセシビリティが必要です。Similarly, the return type and the parameter types of any member that is a method, indexer, or delegate must be at least as accessible as the member itself. たとえば、クラス C を返すメソッド M を public にするためには、C も public である必要があります。For example, you cannot have a public method M that returns a class C unless C is also public. 同様に、A が private として宣言されている場合、A 型のプロパティを protected にすることはできません。Likewise, you cannot have a protected property of type A if A is declared as private.

ユーザー定義の演算子は、必ず public として宣言する必要があります。User-defined operators must always be declared as public. 詳細については、「operator (C# Reference) (operator (C# リファレンス))」を参照してください。For more information, see operator (C# Reference).

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

クラスまたは構造体のメンバーにアクセス レベルを設定するには、該当するキーワードをメンバーの宣言に追加します。その例を次に示します。To set the access level for a class or struct member, add the appropriate keyword to the member declaration, as shown in the following example.

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

注意

protected internal のアクセシビリティ レベルは、"protected AND internal" ではなく "protected OR internal" という意味になります。The protected internal accessibility level means protected OR internal, not protected AND internal. つまり、protected internal のメンバーには、同じアセンブリ内の任意のクラス (派生クラスも含む) からアクセスすることができます。In other words, a protected internal member can be accessed from any class in the same assembly, including derived classes. 同じアセンブリ内の派生クラスのみにアクセシビリティを限定するには、クラス自体は internal として宣言し、そのメンバーを protected として宣言します。To limit accessibility to only derived classes in the same assembly, declare the class itself internal, and declare its members as protected. また、C# 7.2 以降、外側のクラスを internal にしなくても、private protected アクセス修飾子を利用して同じ結果を得ることができます。Also, starting with C# 7.2, you can use the private protected access modifier to achieve the same result without need to make the containing class internal.

その他の型Other Types

名前空間内に直接宣言されたインターフェイスは、public または internal として宣言できます。クラスや構造体と同様、インターフェイスの既定のアクセス レベルは internal になります。Interfaces declared directly within a namespace can be declared as public or internal and, just like classes and structs, interfaces default to internal access. インターフェイスのメンバーは常に public です。他の型がクラスや構造体にアクセスできるようにすることがインターフェイスの目的であるためです。Interface members are always public because the purpose of an interface is to enable other types to access a class or struct. インターフェイスのメンバーにアクセス修飾子を適用することはできません。No access modifiers can be applied to interface members.

列挙型のメンバーは常に public となり、アクセス修飾子を適用することはできません。Enumeration members are always public, and no access modifiers can be applied.

デリゲートの振る舞いは、クラスおよび構造体と似ています。Delegates behave like classes and structs. 既定では、名前空間内に直接宣言されているときには internal アクセスが、入れ子にされているときは private アクセスが適用されます。By default, they have internal access when declared directly within a namespace, and private access when nested.

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

参照See Also