Partilhar via


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.

Consulte também