new-Modifizierer (C#-Referenz)new Modifier (C# Reference)

Wenn das Schlüsselwort new als Deklarationsmodifizierer verwendet wird, blendet es explizit einen von einer Basisklasse geerbten Member aus.When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. Wenn Sie einen geerbten Member ausblenden, ersetzt die abgeleitete Version des Members die Basisklassenversion.When you hide an inherited member, the derived version of the member replaces the base class version. Obwohl Sie Member verdecken können, ohne den new-Modifizierer zu verwenden, wird eine Compilerwarnung angezeigt.Although you can hide members without using the new modifier, you get a compiler warning. Wenn Sie new verwenden, um einen Member explizit auszublenden, wird diese Warnung unterdrückt.If you use new to explicitly hide a member, it suppresses this warning.

Um einen geerbten Member auszublenden, deklarieren Sie ihn mit demselben Membernamen in der abgeleiteten Klasse und ändern ihn mit dem new-Schlüsselwort.To hide an inherited member, declare it in the derived class by using the same member name, and modify it with the new keyword. Zum Beispiel:For example:

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

In diesem Beispiel wird BaseC.Invoke durch DerivedC.Invoke ausgeblendet.In this example, BaseC.Invoke is hidden by DerivedC.Invoke. Der Vorgang wirkt sich nicht auf das Feld x aus, da es nicht mit einem ähnlichen Namen ausgeblendet wird.The field x is not affected because it is not hidden by a similar name.

Das Ausblenden des Namens durch Vererbung nimmt eine der folgenden Formen an:Name hiding through inheritance takes one of the following forms:

  • Im Allgemeinen blendet eine Konstante, ein Feld, eine Eigenschaft oder einen Typ, der in einer Klasse oder Struktur eingegeben wird, alle Basisklassenmember aus, die den gleichen Namen haben.Generally, a constant, field, property, or type that is introduced in a class or struct hides all base class members that share its name. Es werden bestimmte Fälle unterschieden.There are special cases. Wenn Sie beispielsweise ein neues Feld mit dem Namen N mit einem nicht aufrufbaren Typ deklarieren, und ein Basistyp deklariert N als Methode, blendet das neue Feld die Basisdeklaration nicht in der Aufrufsyntax aus.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. Finden Sie unter der 5.0 c#-Programmiersprachenspezifikation Details (siehe Abschnitt "Suche" im Abschnitt "Ausdrücke").See the C# 5.0 language specification for details (see section "Member Lookup" in section "Expressions").

  • Durch eine Methode, die in eine Klasse oder Struktur eingeführt ist, werden Eigenschaften, Felder und Typen mit dem gleichen Namen in der Basisklasse ausgeblendet.A method introduced in a class or struct hides properties, fields, and types that share that name in the base class. Alle Basisklassenmethoden mit der gleichen Signatur werden ebenfalls ausgeblendet.It also hides all base class methods that have the same signature.

  • Durch einen Indexer, der in einer Klasse oder Struktur eingeführt ist, werden alle Basisklassenindexer mit der gleichen Signatur ausgeblendet.An indexer introduced in a class or struct hides all base class indexers that have the same signature.

new und override dürfen nicht gleichzeitig auf denselben Member angewendet werden, da sich die Bedeutungen der beiden Modifizierer gegenseitig ausschließen.It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. Mit dem new-Modifizierer wird ein neuer Member mit demselben Namen erstellt, und der ursprüngliche Member wird ausgeblendet.The new modifier creates a new member with the same name and causes the original member to become hidden. Der override-Modifizierer verlängert die Implementierung für einen geerbten Member.The override modifier extends the implementation for an inherited member.

Wenn der new-Modifizierer in einer Deklaration verwendet wird, in der kein geerbter Member ausgeblendet wird, wird eine Warnung generiert.Using the new modifier in a declaration that does not hide an inherited member generates a warning.

BeispielExample

In diesem Beispiel wird von einer Basisklasse, BaseC, und einer abgeleiteten Klasse, DerivedC, der gleiche Feldname x verwendet. Auf diese Weise wird der Wert des geerbten Felds ausgeblendet.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. Im Beispiel wird die Verwendung des new-Modifizierers veranschaulicht.The example demonstrates the use of the new modifier. Außerdem wird gezeigt, wie mit den voll qualifizierten Namen auf die ausgeblendeten Member der Basisklasse zugegriffen wird.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
*/

BeispielExample

In diesem Beispiel blendet eine geschachtelte Klasse eine Klasse mit dem gleichen Namen in der Basisklasse aus.In this example, a nested class hides a class that has the same name in the base class. Das Beispiel veranschaulicht, wie mit dem new-Modifizierer die Warnmeldung vermieden wird und wie mit den voll qualifizierten Namen auf die ausgeblendeten Klassenmember zugegriffen wird.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
*/

Wenn der new-Modifizierer entfernt wird, kann das Programm dennoch kompiliert und ausgeführt werden. Es wird jedoch folgende Warnung angezeigt: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#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-SchlüsselwörterC# Keywords
OperatorschlüsselwörterOperator Keywords
ModifiziererModifiers
Versionsverwaltung mit den Schlüsselwörtern "override" und "new"Versioning with the Override and New Keywords
Wann müssen die Schlüsselwörter "override" und "new" verwendet werden?Knowing When to Use Override and New Keywords