protected (C# リファレンス)

protected キーワードはメンバー アクセス修飾子です。

注意

このページでは、protected アクセスについて説明します。 protected キーワードもアクセス修飾子の protected internalprivate protected に含まれます。

protected メンバーは、そのクラス内部と、派生クラスのインスタンスからアクセスできます。

protected と他のアクセス修飾子の比較については、「アクセシビリティ レベル」を参照してください。

例 1

派生クラス内で基底クラスの protected メンバーにアクセスできるのは、派生クラスの型を通してアクセスした場合のみです。 たとえば、次のコード セグメントを考えてみます。

class A
{
    protected int x = 123;
}

class B : A
{
    static void Main()
    {
        var a = new A();
        var b = new B();

        // Error CS1540, because x can only be accessed by
        // classes derived from A.
        // a.x = 10;

        // OK, because this class derives from A.
        b.x = 10;
    }
}

ステートメント a.x = 10 でエラーが発生します。これは、クラス B のインスタンスではなく、静的メソッド Main 内にあるためです。

構造体は継承できないため、構造体のメンバーを protected にすることはできません。

例 2

この例では、DerivedPoint クラスは Point から派生しています。 そのため、基底クラスの protected メンバーに、派生クラスから直接アクセスできます。

class Point
{
    protected int x;
    protected int y;
}

class DerivedPoint: Point
{
    static void Main()
    {
        var dpoint = new DerivedPoint();

        // Direct access to protected members.
        dpoint.x = 10;
        dpoint.y = 15;
        Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
    }
}
// Output: x = 10, y = 15

xy のアクセス レベルを private に変更すると、コンパイラによってエラー メッセージが生成されます。

'Point.y' is inaccessible due to its protection level.

'Point.x' is inaccessible due to its protection level.

C# 言語仕様

詳細については、「C# 言語仕様」の宣言されたアクセシビリティに関するセクションを参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目