nowy operator — new operator tworzy nowe wystąpienie typu

Operator new tworzy nowe wystąpienie typu. Możesz również użyć słowa kluczowego newjako modyfikatora deklaracji składowej lub ograniczenia typu ogólnego.

Wywołanie konstruktora

Aby utworzyć nowe wystąpienie typu, zazwyczaj wywołujesz jeden z konstruktorów tego typu przy użyciu new operatora :

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

Możesz użyć inicjatora obiektu lub kolekcji z operatoremnew, aby utworzyć wystąpienie i zainicjować obiekt w jednej instrukcji, jak pokazano w poniższym przykładzie:

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

Typ docelowy new

Wyrażenia wywołania konstruktora są typizowane przez obiekt docelowy. Oznacza to, że jeśli znany jest typ docelowy wyrażenia, można pominąć nazwę typu, jak pokazano w poniższym przykładzie:

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 }
};

Jak pokazano w poprzednim przykładzie, zawsze należy używać nawiasów w wyrażeniu typu new docelowego.

Jeśli typ docelowy new wyrażenia jest nieznany (na przykład w przypadku używania var słowa kluczowego), musisz określić nazwę typu.

Tworzenie tablicy

Operator służy new również do tworzenia wystąpienia tablicy, jak pokazano w poniższym przykładzie:

var numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
Console.WriteLine(string.Join(", ", numbers));
// Output:
// 10, 20, 30

Użyj składni inicjowania tablicy, aby utworzyć wystąpienie tablicy i wypełnić je elementami w jednej instrukcji. W poniższym przykładzie przedstawiono różne sposoby, w jaki można to zrobić:

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[]

Aby uzyskać więcej informacji na temat tablic, zobacz Tablice.

Tworzenie wystąpień typów anonimowych

Aby utworzyć wystąpienie typu anonimowego, użyj new operatora i składni inicjatora obiektów:

var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!

Niszczenie wystąpień typu

Nie trzeba niszczyć wcześniej utworzonych wystąpień typu. Wystąpienia typów odwołań i wartości są niszczone automatycznie. Wystąpienia typów wartości są niszczone natychmiast po zniszczeniu kontekstu zawierającego je. Wystąpienia typów odwołań są niszczone przez moduł odśmiecający śmieci w nieokreślonym czasie po usunięciu ostatniego odwołania do nich.

W przypadku wystąpień typów, które zawierają zasoby niezarządzane, na przykład dojście do plików, zaleca się zastosowanie deterministycznego czyszczenia w celu zapewnienia, że zasoby, które zawierają, są zwalniane tak szybko, jak to możliwe. Aby uzyskać więcej informacji, zobacz dokumentację interfejsu System.IDisposable API i artykuł dotyczący instrukcji using .

Przeciążenie operatora

Typ zdefiniowany przez użytkownika nie może przeciążyć new operatora.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję nowy operator specyfikacji języka C#.

Aby uzyskać więcej informacji na temat wyrażenia typu new docelowego, zobacz notatkę dotyczącą propozycji funkcji.

Zobacz też