new-Operator (C#-Referenz)

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.

Konstruktoraufruf

Um eine neue Instanz eines Typs zu erstellen, rufen Sie in der Regel einen der Konstruktoren dieses Typs mit dem new-Operator 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

Ab C# 9.0 sind Konstruktoraufforderungsausdrücke 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 das vorherige Beispiel zeigt, verwenden Sie immer Klammern in einem zieltypisierten new-Ausdruck.

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 keine zuvor angelegten Typinstanzen zerstören. Instanzen sowohl von Verweis- als auch von Werttypen werden automatisch zerstört. Instanzen von Werttypen werden zerstört, sobald der sie enthaltende Kontext zerstört wird. Instanzen von Verweistypen werden vom Garbage Collector zu einem unbestimmten Zeitpunkt zerstört, nachdem der letzte Verweis auf sie entfernt wurde.

Bei Typinstanzen, die nicht verwaltete Ressourcen wie beispielsweise ein Dateihandle enthalten, ist eine deterministische Bereinigung empfehlenswert, um sicherzustellen, dass die darin enthaltenen Ressourcen so bald wie möglich freigegeben werden. Weitere Informationen finden Sie im Artikel zum System.IDisposableAPI-Verweis und der using-Anweisung.

Operatorüberladbarkeit

Ein benutzerdefinierter Typ kann den new-Operator 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.

Weitere Informationen