novo operador - O new
operador cria uma nova instância de um tipo
O new
operador cria uma nova instância de um tipo. Você também pode usar a new
palavra-chave como um modificador de declaração de membro ou uma restrição de tipo genérico.
Invocação do construtor
Para criar uma nova instância de um tipo, você normalmente invoca um dos construtores desse tipo usando o new
operador:
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 new
operador 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
Segmentado new
As expressões de invocação do construtor são tipificadas 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 exemplo a seguir:
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 digitada new
de destino.
Se um tipo de destino de uma new
expressão for desconhecido (por exemplo, quando você usa a palavra-chave var
), você deve especificar um nome de tipo.
Criação de matrizes
Você também usa o new
operador 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 da matriz para criar uma instância de matriz e preenchê-la com elementos em uma instrução. O exemplo a seguir mostra várias maneiras de 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, consulte Matrizes.
Instanciação de tipos anónimos
Para criar uma instância de um tipo anônimo, use a sintaxe do operador e do new
inicializador de objeto:
var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!
Destruição de instâncias de tipo
Não é necessário destruir instâncias de tipo criadas anteriormente. As instâncias dos tipos de referência e de valor são destruídas automaticamente. As instâncias de tipos de valor são destruídas assim que o contexto que as contém é destruído. Instâncias de tipos de referência são destruídas pelo coletor de lixo em algum momento não especificado depois que a última referência a eles é removida.
Para instâncias de tipo que contêm recursos não gerenciados, por exemplo, um identificador de arquivo, é recomendável empregar limpeza determinística para garantir que os recursos que contêm sejam liberados o mais rápido possível. Para obter mais informações, consulte a referência da System.IDisposable API e o artigo da using
instrução .
Capacidade de sobrecarga do operador
Um tipo definido pelo usuário não pode sobrecarregar o new
operador.
Especificação da linguagem C#
Para obter mais informações, consulte A seção O novo operador da especificação da linguagem C#.
Para obter mais informações sobre uma expressão digitada new
de destino, consulte a nota de proposta de recurso.