Поделиться через


новый оператор — new оператор создает новый экземпляр типа

Оператор new создает экземпляр типа. Ключевое слово new можно также использовать как модификатор объявления члена или ограничение универсального типа.

Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Подсказка

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.

Вызов конструктора

Чтобы создать новый экземпляр типа, вызовите один из конструкторов этого типа с помощью new оператора:

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

Для создания экземпляра объекта и его инициализации в одном операторе можно использовать инициализатор объекта или элементов с оператором new, как в следующем примере:

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

Типизированный целевой объект new

Выражения вызова конструктора являются целевыми типами. То есть, если известен целевой тип выражения, вы можете опустить имя типа, как показано в следующем примере:

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

Как показано в предыдущем примере, всегда используйте скобки в целевом типизированном new выражении.

Если целевой тип выражения new неизвестен (например, если вы используете ключевое слово var), нужно указать имя типа.

создание массива

С помощью оператора new можно также создать экземпляр массива, как показано в следующем примере:

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

Чтобы создать экземпляр массива и заполнить его элементами в одном операторе, используйте синтаксис инициализации массива. В следующем примере показаны различные способы сделать это:

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

Дополнительные сведения см. в руководстве по работе с массивами.

Создание экземпляров анонимных типов

Чтобы создать экземпляр анонимного типа, используйте оператор new и синтаксис инициализации объекта:

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

Уничтожение экземпляров типа

Вам не нужно уничтожать ранее созданные экземпляры типов. Система автоматически уничтожает экземпляры ссылочных и типов значений. Система уничтожает экземпляры типов значений сразу после уничтожения контекста, содержащего их. Сборщик мусора уничтожает экземпляры ссылочных типов в некоторое время после удаления последней ссылки.

Для экземпляров типов, содержащих неуправляемые ресурсы, например детерминированный детерминированный очистка, чтобы обеспечить освобождение ресурсов как можно скорее. Дополнительные сведения см. в справочнике System.IDisposable по API и статье инструкцииusing.

Возможность перегрузки оператора

Определяемый пользователем тип не может перегружать new оператор.

Спецификация языка C#

Дополнительные сведения см. в разделе Оператор newспецификация языка C#.

Подробные сведения о выражении new с целевым типом см. в примечании к предлагаемой функции.

См. также