new-Modifizierer (C#-Referenz)

Wenn das Schlüsselwort new als Deklarationsmodifizierer verwendet wird, blendet es explizit einen von einer Basisklasse geerbten Member aus. Wenn Sie einen geerbten Member ausblenden, ersetzt die abgeleitete Version des Members die Basisklassenversion. Obwohl Sie Member verdecken können, ohne den new-Modifizierer zu verwenden, wird eine Compilerwarnung angezeigt. Wenn Sie new verwenden, um einen Member explizit auszublenden, wird diese Warnung unterdrückt.

Um einen geerbten Member auszublenden, deklarieren Sie ihn mit demselben Membernamen in der abgeleiteten Klasse und ändern ihn mit dem new-Schlüsselwort. Beispiel:

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. Der Vorgang wirkt sich nicht auf das Feld x aus, da es nicht mit einem ähnlichen Namen ausgeblendet wird.

Das Ausblenden des Namens durch Vererbung nimmt eine der folgenden Formen an:

  • 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. Es werden bestimmte Fälle unterschieden. 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. Weitere Informationen finden Sie unter C#-Sprachspezifikation (siehe Abschnitt „Suche nach Membern“ im Abschnitt „Ausdrücke“).

  • 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. Alle Basisklassenmethoden mit der gleichen Signatur werden ebenfalls ausgeblendet.

  • Durch einen Indexer, der in einer Klasse oder Struktur eingeführt ist, werden alle Basisklassenindexer mit der gleichen Signatur ausgeblendet.

new und override dürfen nicht gleichzeitig auf denselben Member angewendet werden, da sich die Bedeutungen der beiden Modifizierer gegenseitig ausschließen. Mit dem new-Modifizierer wird ein neuer Member mit demselben Namen erstellt, und der ursprüngliche Member wird ausgeblendet. Der override-Modifizierer verlängert die Implementierung für einen geerbten Member.

Wenn der new-Modifizierer in einer Deklaration verwendet wird, in der kein geerbter Member ausgeblendet wird, wird eine Warnung generiert.

Beispiel

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. Im Beispiel wird die Verwendung des new-Modifizierers veranschaulicht. Außerdem wird gezeigt, wie mit den voll qualifizierten Namen auf die ausgeblendeten Member der Basisklasse zugegriffen wird.

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

Beispiel

In diesem Beispiel blendet eine geschachtelte Klasse eine Klasse mit dem gleichen Namen in der Basisklasse aus. 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.

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:

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

C#-Programmiersprachenspezifikation

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

Siehe auch

C#-Referenz
C#-Programmierhandbuch
C#-Schlüsselwörter
Operatorschlüsselwörter
Modifizierer
Versionsverwaltung mit den Schlüsselwörtern „override“ und „new“
Wann müssen die Schlüsselwörter "override" und "new" verwendet werden?