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.

A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em versões preliminares públicas para a próxima versão da linguagem.

A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.

Sugestão

Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.

Invocação do construtor

Para criar uma nova instância de um tipo, invoque 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, use sempre parênteses numa expressão de tipo new alvo.

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 precisas de destruir instâncias de tipo previamente criadas. O sistema destrói automaticamente instâncias tanto de tipos de referência como de valor. O sistema destrói instâncias de tipos de valor assim que o contexto que os contém é destruído. O coletor de lixo destrói instâncias de tipos de referência num momento não especificado, depois de a última referência a eles ser removida.

Para instâncias de tipo que contenham recursos não geridos, como um handle de ficheiro, utilize limpeza determinística para garantir que os recursos são libertados o mais rapidamente 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