new-Modifizierer (C#-Referenz)

Aktualisiert: November 2007

Wenn das new-Schlüsselwort als Modifizierer 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 ohne die Verwendung des new-Modifizierers ausblenden können, ist das Ergebnis eine Warnung. Wenn Sie new verwenden, um einen Member explizit auszublenden, unterdrücken Sie diese Warnung und dokumentieren, dass die abgeleitete Version zum Ersetzen verwendet wird.

Um einen geerbten Member auszublenden, deklarieren Sie ihn mit demselben Namen in der abgeleiteten Klasse und ändern ihn mit dem new-Modifizierer. 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 x-Feld aus, da es nicht mit einem ähnlichen Namen ausgeblendet wird.

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

  • Durch Konstanten, Felder, Eigenschaften oder Typen, die in eine Klasse oder Struktur eingeführt sind, werden alle Basisklassenmember mit dem gleichen Namen ausgeblendet.

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

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

Mit dem new-Modifizierer kann außerdem ein geschachtelter Typ geändert werden, wenn durch diesen ein anderer Typ ausgeblendet wird. Dies wird im folgenden Beispiel veranschaulicht.

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie im folgenden Abschnitt in der C#-Programmiersprachenspezifikation:

  • 10.3.4 Der new-Modifizierer

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

C#-Schlüsselwörter

Operatorschlüsselwörter (C#-Referenz)

Modifizierer (C#-Referenz)

Weitere Ressourcen

C#-Referenz