Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Quando uma classe ou struct é instanciada, o runtime chama seu construtor. Os construtores têm o mesmo nome que a classe ou struct e eles geralmente inicializam os membros de dados do novo objeto.
No exemplo a seguir, uma classe chamada Taxi é definida usando um construtor simples. Essa classe é então instanciada com o operador new. O runtime invoca o construtor Taxi imediatamente depois que a memória é alocada para o novo objeto.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
Um construtor que não tem nenhum parâmetro é chamado de construtor sem parâmetros. O runtime invoca o construtor sem parâmetros quando um objeto é instanciado usando o operador new e nenhum argumento é fornecido para new. O C# 12 introduziu construtores primários. Um construtor primário especifica parâmetros que devem ser fornecidos para inicializar um novo objeto. Para obter mais informações, consulte Construtores de instâncias.
A menos que a classe seja static, as classes sem construtores recebem um construtor sem parâmetros público pelo compilador C# para habilitar a instanciação de classe. Para obter mais informações, consulte Classes estáticas e membros de classes estáticas.
Você pode impedir que uma classe seja instanciada tornando o construtor privado, da seguinte maneira:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Para obter mais informações, consulte Construtores particulares.
Construtores para tipos struct se assemelham a construtores de classe. Quando um tipo de struct é instanciado com new, o runtime invoca um construtor. Quando um struct é definido como seu valor default, o runtime inicializa toda a memória no struct como 0. Se declarar os inicializadores de campo em um tipo de struct, você deverá fornecer um construtor sem parâmetros. Para obter mais informações, consulte a seção Inicialização de struct e valores padrão do artigo Tipos de estrutura.
O código a seguir usa o construtor sem parâmetros para Int32, para que você tenha certeza de que o inteiro é inicializado:
int i = new int();
Console.WriteLine(i);
O código a seguir, no entanto, causa um erro do compilador porque ele não usa newe porque tenta usar um objeto que não é inicializado:
int i;
Console.WriteLine(i);
Como alternativa, alguns tipos de struct (incluindo todos os tipos numéricos internos) podem ser inicializados ou atribuídos e, em seguida, usados como no exemplo a seguir:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Classes e structs podem definir construtores que recebem parâmetros, incluindo construtores primários. Os construtores que usam parâmetros devem ser chamados por meio de uma instrução new ou uma instrução base. As classes e structs também podem definir vários construtores e nenhum deles precisa definir um construtor sem parâmetros. Por exemplo:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary) => Salary = annualSalary;
public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}
Essa classe pode ser criada usando qualquer uma das instruções a seguir:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Um construtor pode usar a palavra-chave base para chamar o construtor de uma classe base. Por exemplo:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
Neste exemplo, o construtor da classe base é chamado antes que o bloco do construtor seja executado. A palavra-chave base pode ser usada com ou sem parâmetros. Os parâmetros para o construtor podem ser usados como parâmetros para base ou como parte de uma expressão. Para obter mais informações, consulte base.
Em uma classe derivada, se um construtor de classe base não for chamado explicitamente usando a palavra-chave base, o construtor sem parâmetros, se houver, será chamado implicitamente. As seguintes declarações de construtor são efetivamente iguais:
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
Se uma classe base não oferecer um construtor sem parâmetros, a classe derivada deverá fazer uma chamada explícita para um construtor base usando base.
Um construtor pode invocar outro construtor no mesmo objeto usando a palavra-chave this. Como base, this pode ser usado com ou sem parâmetros e todos os parâmetros no construtor estão disponíveis como parâmetros para this ou como parte de uma expressão. Por exemplo, o segundo construtor no exemplo anterior pode ser reescrito usando this:
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
O uso da palavra-chave this no exemplo anterior faz com que o seguinte construtor seja chamado:
public Employee(int annualSalary) => Salary = annualSalary;
Os construtores podem ser marcados como public, private, protected, interno, protegido interno ou private protected. Esses modificadores de acesso definem como os usuários da classe podem construir a classe. Para obter mais informações, consulte Modificadores de Acesso.
Um construtor pode ser declarado estático usando a palavra-chave static. Construtores estáticos são chamados automaticamente, antes que quaisquer campos estáticos sejam acessados e sejam usados para inicializar membros de classe estática. Para obter mais informações, consulte Construtores estáticos.
Especificação da Linguagem C#
Para obter mais informações, veja Construtores de instância e Construtores estáticos na Especificação de Linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.