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, consulte a System.IDisposable Referência da API e o artigo using
de instrução.
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.