new 修飾子 (C# リファレンス)

new キーワードを宣言の修飾子として使用すると、基底クラスから継承されたメンバーを明示的に隠ぺいできます。 継承されたメンバーを隠ぺいすると、派生バージョンのメンバーで基底クラスのバージョンが置き換えられます。 これは、メンバーの基底クラス バージョンが private として、または一部のケースでは internal としてマークされていた場合は非表示になるため、表示されることを前提としています。 new 修飾子を使わずに public メンバーまたは protected メンバーを非表示にすることもできますが、コンパイラ警告が表示されます。 メンバーを明示的に隠ぺいするために new を使用する場合は、この警告が抑制されます。

new キーワードは、型のインスタンスの作成に使用することも、またはジェネリック型制約として使用することもできます。

継承されたメンバーを隠ぺいするには、派生クラスで同じメンバー名を使用してメンバーを宣言し、new キーワードで修飾します。 次に例を示します。

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

この例では、BaseC.InvokeDerivedC.Invoke で隠ぺいされます。 x フィールドは、似た名前によって隠ぺいされないため、影響を受けません。

継承による名前の隠ぺいは、次のいずれかの形式で行われます。

  • 一般的に、定数、フィールド、プロパティ、型をクラスまたは構造体で使用すると、同じ名前を共有するすべての基底クラス メンバーが隠ぺいされます。 次のような特殊な状況があります。 たとえば、呼び出し可能ではない型を持つ N という名前の新しいフィールドを宣言し、基本型が N をメソッドとして宣言する場合は、新しいフィールドが呼び出し構文内で基本型の宣言を隠ぺいすることはありません。 詳細については、C# 言語仕様の「メンバー ルックアップ」セクションを参照してください。

  • メソッドをクラスまたは構造体で使用すると、基底クラスで同じ名前を共有するプロパティ、フィールド、型が隠ぺいされます。 また、同じシグネチャを持つすべての基底クラス メソッドも隠ぺいされます。

  • インデクサーをクラスまたは構造体で使用すると、同じシグネチャを持つすべての基底クラス インデクサーが隠ぺいされます。

newoverride には相反する意味があるため、同じメンバーにこの 2 つの修飾子を使用するとエラーになります。 new 修飾子は、同じ名前で新しいメンバーを作成し、元のメンバーを隠ぺいします。 override 修飾子は、継承されたメンバーの実装を拡張します。

宣言で、継承されたメンバーを隠ぺいしない new 修飾子を使用すると、警告が出力されます。

この例では、基底クラス BaseC と派生クラス DerivedC が同じフィールド名 x を使用するため、継承されるフィールドの値が隠ぺいされます。 この例では、new 修飾子の使い方を示します。 また、基底クラスの隠ぺいされたメンバーに完全修飾名を使ってアクセスする方法も示します。

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

この例では、入れ子になったクラスが、基底クラスにある同名のクラスを隠ぺいします。 この例では、new 修飾子を使って警告メッセージが表示されないようにする方法に加えて、完全修飾名を使用してクラスの隠ぺいされたメンバーにアクセスする方法も示します。

public class BaseC
{
    public class NestedC
    {
        public int x = 200;
        public int y;
    }
}

public class DerivedC : BaseC
{
    // Nested type hiding the base type members.
    new public class NestedC
    {
        public int x = 100;
        public int y;
        public int z;
    }

    static void Main()
    {
        // Creating an object from the overlapping class:
        NestedC c1  = new NestedC();

        // Creating an object from the hidden class:
        BaseC.NestedC c2 = new BaseC.NestedC();

        Console.WriteLine(c1.x);
        Console.WriteLine(c2.x);
    }
}
/*
Output:
100
200
*/

new 修飾子を削除すると、プログラムのコンパイルおよび実行は行われますが、次の警告が出力されます。

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

C# 言語仕様

詳細については、C# 言語仕様の「new 修飾子」セクションを参照してください。

関連項目