Partilhar via


Usando construtores (Guia de Programação em C#)

Quando uma classe ou struct é instanciada, seu construtor é chamado. Os construtores têm o mesmo nome que a classe ou struct, e geralmente inicializam os membros de dados do novo objeto.

No exemplo a seguir, uma classe nomeada Taxi é definida usando um construtor simples. Essa classe é então instanciada com o novo operador. O Taxi construtor é invocado pelo operador imediatamente após a new memória é alocada para o novo objeto.

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.IsInitialized);
    }
}

Um construtor que não usa parâmetros é chamado de construtor sem parâmetros. Construtores sem parâmetros são invocados sempre que um objeto é instanciado usando o new operador e nenhum argumento é fornecido ao new. C# 12 introduz 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ância.

A menos que a classe seja estática, 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 privados.

Construtores para tipos struct se assemelham a construtores de classe. Quando um tipo struct é instanciado com new, um construtor é invocado. Quando a struct é definido como seu default valor, o tempo de execução inicializa toda a memória na struct como 0. Antes do C# 10, structs não pode conter um construtor sem parâmetros explícito porque um é fornecido automaticamente pelo compilador. 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 foi inicializado:

int i = new int();
Console.WriteLine(i);

O código a seguir, no entanto, causa um erro de compilador porque ele não usa new, e porque ele tenta usar um objeto que não foi inicializado:

int i;
Console.WriteLine(i);

Como alternativa, os objetos baseados em structs (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);

Tanto as classes quanto as structs podem definir construtores que usam parâmetros, incluindo construtores primários. Os construtores que usam parâmetros devem ser chamados por meio de uma new instrução ou uma instrução base . Classes e structs também podem definir vários construtores, e nenhum deles é necessário para 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 uma das seguintes instruções:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Um construtor pode usar a base palavra-chave 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 para a classe base é chamado antes do bloco para o construtor é executado. A base palavra-chave pode ser usada com ou sem parâmetros. Quaisquer 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 é chamado explicitamente usando a base palavra-chave, o construtor sem parâmetros, se houver um, é chamado implicitamente. As seguintes declarações de construtor são efetivamente as mesmas:

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 quaisquer 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 this palavra-chave no exemplo anterior faz com que este construtor seja chamado:

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

Os construtores podem ser marcados como públicos, privados, protegidos, internos, protegidos internos ou privados. 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 estática . Os construtores estáticos são chamados automaticamente, imediatamente antes de qualquer campo estático ser acessado, e são usados para inicializar membros da classe estática. Para obter mais informações, consulte Construtores estáticos.

Especificação da linguagem C#

Para obter mais informações, consulte 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 do C#.

Consulte também