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

new キーワードを宣言の修飾子として使用すると、基底クラスから継承されたメンバーを明示的に隠ぺいできます。When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. 継承されたメンバーを隠ぺいすると、派生バージョンのメンバーで基底クラスのバージョンが置き換えられます。When you hide an inherited member, the derived version of the member replaces the base class version. new 修飾子を使わずにメンバーを隠ぺいすることもできますが、コンパイラ警告が表示されます。Although you can hide members without using the new modifier, you get a compiler warning. メンバーを明示的に隠ぺいするために new を使用する場合は、この警告が抑制されます。If you use new to explicitly hide a member, it suppresses this warning.

継承されたメンバーを隠ぺいするには、派生クラスで同じメンバー名を使用してメンバーを宣言し、new キーワードで修飾します。To hide an inherited member, declare it in the derived class by using the same member name, and modify it with the new keyword. 例:For example:

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

この例では、BaseC.InvokeDerivedC.Invoke で隠ぺいされます。In this example, BaseC.Invoke is hidden by DerivedC.Invoke. x フィールドは、似た名前によって隠ぺいされないため、影響を受けません。The field x is not affected because it is not hidden by a similar name.

継承による名前の隠ぺいは、次のいずれかの形式で行われます。Name hiding through inheritance takes one of the following forms:

  • 一般的に、定数、フィールド、プロパティ、型をクラスまたは構造体で使用すると、同じ名前を共有するすべての基底クラス メンバーが隠ぺいされます。Generally, a constant, field, property, or type that is introduced in a class or struct hides all base class members that share its name. 次のような特殊な状況があります。There are special cases. たとえば、呼び出し可能ではない型を持つ N という名前の新しいフィールドを宣言し、基本型が N をメソッドとして宣言する場合は、新しいフィールドが呼び出し構文内で基本型の宣言を隠ぺいすることはありません。For example, if you declare a new field with name N to have a type that is not invocable, and a base type declares N to be a method, the new field does not hide the base declaration in invocation syntax. 詳細については、C# 5.0 の言語仕様 に関するページ ("式" セクション内の "メンバー ルックアップ" セクション) を参照してください。See the C# 5.0 language specification for details (see section "Member Lookup" in section "Expressions").

  • メソッドをクラスまたは構造体で使用すると、基底クラスで同じ名前を共有するプロパティ、フィールド、型が隠ぺいされます。A method introduced in a class or struct hides properties, fields, and types that share that name in the base class. また、同じシグネチャを持つすべての基底クラス メソッドも隠ぺいされます。It also hides all base class methods that have the same signature.

  • インデクサーをクラスまたは構造体で使用すると、同じシグネチャを持つすべての基底クラス インデクサーが隠ぺいされます。An indexer introduced in a class or struct hides all base class indexers that have the same signature.

newoverride には相反する意味があるため、同じメンバーにこの 2 つの修飾子を使用するとエラーになります。It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. new 修飾子は、同じ名前で新しいメンバーを作成し、元のメンバーを隠ぺいします。The new modifier creates a new member with the same name and causes the original member to become hidden. override 修飾子は、継承されたメンバーの実装を拡張します。The override modifier extends the implementation for an inherited member.

宣言で、継承されたメンバーを隠ぺいしない new 修飾子を使用すると、警告が出力されます。Using the new modifier in a declaration that does not hide an inherited member generates a warning.

Example

この例では、基底クラス BaseC と派生クラス DerivedC が同じフィールド名 x を使用するため、継承されるフィールドの値が隠ぺいされます。In this example, a base class, BaseC, and a derived class, DerivedC, use the same field name x, which hides the value of the inherited field. この例では、new 修飾子の使い方を示します。The example demonstrates the use of the new modifier. また、基底クラスの隠ぺいされたメンバーに完全修飾名を使ってアクセスする方法も示します。It also demonstrates how to access the hidden members of the base class by using their fully qualified names.

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
*/

Example

この例では、入れ子になったクラスが、基底クラスにある同名のクラスを隠ぺいします。In this example, a nested class hides a class that has the same name in the base class. この例では、new 修飾子を使って警告メッセージが表示されないようにする方法に加えて、完全修飾名を使用してクラスの隠ぺいされたメンバーにアクセスする方法も示します。The example demonstrates how to use the new modifier to eliminate the warning message and how to access the hidden class members by using their fully qualified names.

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 修飾子を削除すると、プログラムのコンパイルおよび実行は行われますが、次の警告が出力されます。If you remove the new modifier, the program will still compile and run, but you will get the following warning:

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

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

C# リファレンスC# Reference
C# プログラミング ガイドC# Programming Guide
C# のキーワードC# Keywords
演算子のキーワードOperator Keywords
修飾子Modifiers
Override キーワードと New キーワードによるバージョン管理Versioning with the Override and New Keywords
Override キーワードと New キーワードを使用する場合についてKnowing When to Use Override and New Keywords