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. Dabei wird davon ausgegangen, dass die Basisklassenversion des Members sichtbar ist, da sie bereits ausgeblendet wäre, wenn sie als private oder in einigen Fällen als internal markiert wäre. Obwohl Sie public- oder protected-Member ausblenden können, ohne dabei den new-Modifizierer verwenden zu müssen, wird eine Compilerwarnung angezeigt. Wenn Sie new verwenden, um einen Member explizit auszublenden, wird diese Warnung unterdrückt.

Sie können das Schlüsselwort new auch verwenden, um eine Instanz eines Typs zu erstellen oder als Einschränkung eines generischen Typs.

Um einen geerbten Member auszublenden, deklarieren Sie ihn mit demselben Membernamen in der abgeleiteten Klasse und ändern ihn mit dem new-Schlüsselwort. Zum 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 im Abschnitt Membersuchvorgänge der C#-Sprachspezifikation.

  • 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.

Beispiele

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

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#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt Der new-Modifizierer der C#-Sprachspezifikation.

Siehe auch