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.
Operator „new“: Der Operator
Der new-Operator erstellt eine neue Instanz eines Typs. Sie können das Schlüsselwort new auch als einen Memberdeklarationsmodifizierer oder als Einschränkung eines generischen Typs verwenden.
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.
Konstruktoraufruf
Rufen Sie zum Erstellen einer neuen Instanz eines Typs einen der Konstruktoren dieses Typs mithilfe des new Operators auf:
var dict = new Dictionary<string, int>();
dict["first"] = 10;
dict["second"] = 20;
dict["third"] = 30;
Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30
Sie können einen Objekt- oder Auflistungsinitialisierer mit dem new-Operator verwenden, um ein Objekt in einer Anweisung zu instanziieren und zu initialisieren, wie das folgende Beispiel zeigt:
var dict = new Dictionary<string, int>
{
["first"] = 10,
["second"] = 20,
["third"] = 30
};
Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30
Zieltypisierter new
Konstruktoraufforderungsausdrücke sind als Ziel typisiert. Das heißt, wenn der Zieltyp eines Ausdrucks bekannt ist, können Sie einen Typnamen wie im folgenden Beispiel weglassen:
List<int> xs = new();
List<int> ys = new(capacity: 10_000);
List<int> zs = new() { Capacity = 20_000 };
Dictionary<int, List<int>> lookup = new()
{
[1] = new() { 1, 2, 3 },
[2] = new() { 5, 8, 3 },
[5] = new() { 1, 0, 4 }
};
Wie im vorherigen Beispiel gezeigt, verwenden Sie immer Klammern in einem Zielausdruck new .
Wenn der Zieltyp eines new-Ausdrucks unbekannt ist (beispielsweise, wenn Sie das Schlüsselwort var verwenden), müssen Sie einen Typnamen angeben.
Arrayerstellung
Sie können den new-Operator auch verwenden, um eine Arrayinstanz zu erstellen, wie das folgende Beispiel zeigt:
var numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
Console.WriteLine(string.Join(", ", numbers));
// Output:
// 10, 20, 30
Verwenden Sie die Arrayinitialisierungssyntax, um eine Arrayinstanz zu erstellen und sie mit Elementen in einer Anweisung zu auszufüllen. Im folgenden Beispiel werden verschiedene Möglichkeiten dafür veranschaulicht:
var a = new int[3] { 10, 20, 30 };
var b = new int[] { 10, 20, 30 };
var c = new[] { 10, 20, 30 };
Console.WriteLine(c.GetType()); // output: System.Int32[]
Weitere Informationen zu Arrays finden Sie unter Arrays.
Instanziierung von anonymen Typen
Um eine Instanz eines anonymen Typs zu erstellen, verwenden Sie die Syntax für die Initialisierung von new-Operatoren und -Objekten:
var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!
Zerstörung von Typinstanzen
Sie müssen zuvor erstellte Typinstanzen nicht zerstören. Das System zerstört automatisch Instanzen von Bezugs- und Werttypen. Das System zerstört Instanzen von Werttypen, sobald der Kontext, der sie enthält, zerstört wird. Der Garbage Collector zerstört Instanzen von Verweistypen zu einem bestimmten Zeitpunkt, nachdem der letzte Verweis entfernt wurde.
Verwenden Sie für Typinstanzen, die nicht verwaltete Ressourcen enthalten, z. B. ein Dateihandle, eine deterministische Bereinigung, um sicherzustellen, dass die Ressourcen so schnell wie möglich freigegeben werden. Weitere Informationen finden Sie in der System.IDisposable-API-Referenz und im using-Anweisung-Artikel.
Operatorüberladbarkeit
Ein benutzerdefinierter Typ kann den Operator new nicht überladen.
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt Der new-Operator der C#-Sprachspezifikation.
Weitere Informationen zum zieltypisierten new-Ausdruck finden Sie unter Hinweis zum Featurevorschlag.