Freigeben über


new-Modifizierer (C#-Referenz)

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

C#-Programmiersprachenspezifikation

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

Siehe auch

Referenz

C#-Schlüsselwörter

Operatorschlüsselwörter (C#-Referenz)

Modifizierer (C#-Referenz)

Versionsverwaltung mit den Schlüsselwörtern "override" und "new" (C#-Programmierhandbuch)

Wann müssen die Schlüsselwörter "override" und "new" verwendet werden? (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

Weitere Ressourcen

C#-Referenz