Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie das new Schlüsselwort als Deklarationsmodifizierer verwenden, blenden Sie explizit ein Element aus, das eine Basisklasse bereitstellt. Wenn Sie ein geerbtes Element ausblenden, ersetzt die abgeleitete Version des Elements die Basisklassenversion. Sie können ein Element ausblenden, wenn die Basisklassenversion in der abgeleiteten Klasse sichtbar ist. Die Basisklassenversion ist nicht sichtbar, wenn sie in einigen Fällen als private oder in einigen Fällen internalmarkiert ist. Obwohl Sie elemente ausblenden oder public ohne den Modifizierer verwenden protectednew können, erhalten Sie eine Compilerwarnung. Wenn Sie ein new Element explizit ausblenden, wird diese Warnung unterdrückt.
Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.
In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.
Tipp
Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.
Sie können das new Schlüsselwort auch verwenden, um eine Instanz eines Typs oder als generische Typeinschränkung zu erstellen.
Um ein geerbtes Element auszublenden, deklarieren Sie es in der abgeleiteten Klasse mithilfe desselben Membernamens, und ändern Sie es 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 BaseC.Invoke ist ausgeblendet von DerivedC.Invoke. Das Feld x ist nicht betroffen, da es nicht durch einen ähnlichen Namen ausgeblendet ist.
Das Ausblenden von Namen durch Vererbung hat eine der folgenden Formen:
Im Allgemeinen blendet eine Konstante, ein Feld, eine Eigenschaft oder ein Typ, die Sie in einer Klasse oder Struktur einführen, alle Basisklassenmember aus, die ihren Namen gemeinsam verwenden. Es gibt jedoch einige Sonderfälle. Wenn Sie z. B. ein neues Feld mit dem Namen
Ndeklarieren, um einen Typ zu haben, der nicht aufrufbar ist, und ein Basistyp als Methode deklariert, blendetNdas neue Feld die Basisdeklarationssyntax nicht aus. Weitere Informationen finden Sie im Abschnitt " Member-Nachschlagevorgang " der C#-Sprachspezifikation.Eine Methode, die Sie in einer Klasse oder Struktur einführen, blendet Eigenschaften, Felder und Typen aus, die diesen Namen in der Basisklasse gemeinsam verwenden. Außerdem werden alle Basisklassenmethoden ausgeblendet, die dieselbe Signatur aufweisen.
Ein Indizierungsmodul, das Sie in einer Klasse oder Struktur einführen, blendet alle Basisklassenindexer mit derselben Signatur aus.
Es ist ein Fehler, beides new zu verwenden und für dasselbe Element außer Kraft zu setzen , da die beiden Modifizierer sich gegenseitig ausschließende Bedeutungen haben. Der new Modifizierer erstellt ein neues Element mit demselben Namen und bewirkt, dass das ursprüngliche Element ausgeblendet wird. Der override Modifizierer erweitert die Implementierung für ein geerbtes Element.
Wenn Sie den new Modifizierer in einer Deklaration verwenden, die kein geerbtes Element ausblendet, wird eine Warnung generiert.
Beispiele
Verwenden Sie in diesem Beispiel eine Basisklasse und BaseCeine abgeleitete Klasse DerivedCdenselben Feldnamen x, der den Wert des geerbten Felds ausblendet. Das Beispiel veranschaulicht die Verwendung des new Modifizierers. Außerdem wird veranschaulicht, wie mithilfe ihrer vollqualifizierten 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 aus, die denselben Namen in der Basisklasse hat. Im Beispiel wird veranschaulicht, wie sie den new Modifizierer verwenden, um die Warnmeldung zu beseitigen und auf die ausgeblendeten Klassenmber zuzugreifen, indem sie ihre vollqualifizierten Namen verwenden.
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 Sie den new Modifizierer entfernen, wird das Programm weiterhin kompiliert und ausgeführt, es wird jedoch die 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 "Neuer Modifizierer " der C#-Sprachspezifikation.