Operador new – o operador new cria uma instância de um tipo

O operador new cria uma nova instância de um tipo. Você também pode usar a palavra-chave new como um modificador de declaração de membro ou uma restrição de tipo genérico.

Chamada de construtor

Para criar uma nova instância de um tipo, você normalmente invoca um dos construtores desse tipo usando o operador 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

Você pode usar um inicializador de objeto ou coleção com o operador new para instanciar e inicializar um objeto em uma instrução, como mostra o exemplo a seguir:

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 com tipo de destino

As expressões de invocação do construtor têm o tipo de destino. Ou seja, se um tipo de destino de uma expressão for conhecido, você poderá omitir um nome de tipo, como mostra o seguinte exemplo:

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

Como mostra o exemplo anterior, você sempre usa parênteses em uma expressão new com o tipo de destino.

Se o tipo de destino de uma expressão new for desconhecido (por exemplo, quando você usa a palavra-chave var), deverá especificar um nome de tipo.

Criação de matriz

Você também usar o operador new para criar uma instância de matriz, como mostra o exemplo a seguir:

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

Use a sintaxe de inicialização de matriz para criar uma instância de matriz e preenchê-la com os elementos em uma instrução. O exemplo a seguir mostra várias maneiras de como fazer isso:

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

Para obter mais informações sobre matrizes, confira Matrizes.

Instanciação de tipos anônimos

Para criar uma instância de um tipo anônimo, use o operador new e a sintaxe do inicializador de objeto:

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

Destruição de instâncias do tipo

Você não precisa destruir as instâncias do tipo criadas anteriormente. As instâncias dos tipos de referência e de valor são destruídas automaticamente. As instâncias dos tipos de valor serão destruídas assim que o contexto que as contém for destruído. As instâncias dos tipos de referência serão destruídas pelo coletor de lixo em algum momento não especificado depois que a última referência a eles for removida.

Para instâncias de tipos que contêm recursos não gerenciados, como um identificador de arquivo, é recomendável empregar limpeza determinística para garantir que os recursos sejam liberados assim que possível. Para obter mais informações, veja o artigo System.IDisposable Referência da API e a instrução de uso.

Capacidade de sobrecarga do operador

Um tipo definido pelo usuário não pode sobrecarregar o operador new.

Especificação da linguagem C#

Para saber mais, confira a seção O operador new na especificação da linguagem C#.

Para obter mais informações sobre uma expressão de tipo de destino new, confira a nota de proposta de recurso.

Confira também