Como chamar um construtor a partir de outro em C#: soluções simples

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que isso é importante: um construtor é bom, mas dois é melhor

\n\n

Você já escreveu uma classe em C# e percebeu que tem vários construtores que fazem quase a mesma coisa? Por exemplo, um aceita nome e idade, outro apenas o nome, e um terceiro não aceita nada. Em vez de copiar o mesmo código em cada construtor, o C# oferece uma solução elegante: chamar um construtor a partir de outro. Isso não apenas economiza tempo — torna o código mais limpo, mais claro e mais fácil de manter. Hoje vamos explorar este tópico com exemplos reais, como se você tivesse acabado de encontrar uma pergunta popular no Stack Overflow. Vamos lá!

\n\n

Como funciona a chamada de um construtor a partir de outro em C#

\n\n

Em C#, você pode chamar um construtor a partir de outro usando as palavras-chave this e base. Isso é chamado de "encadeamento de construtores" (constructor chaining). Vamos analisar ambas as opções.

\n\n

1. Palavra-chave this — chamar um construtor na mesma classe

\n\n

Quando você tem vários construtores na mesma classe, pode usar this para passar o controle para um deles. Isso é especialmente útil quando um construtor é uma "generalização" de outro.

\n\n

Exemplo simples: a classe Person, que armazena nome e idade. O construtor padrão define valores padrão, enquanto o construtor parametrizado permite sobrescrevê-los.

\n\n
public class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n\n    // Construtor padrão\n    public Person() : this("Convidado", 18)\n    {\n        // Não escrevemos nada aqui — o encadeamento faz tudo\n    }\n\n    // Construtor com parâmetros\n    public Person(string name, int age)\n    {\n        Name = name;\n        Age = age;\n    }\n}
\n\n

Neste código, o ponto-chave é : this("Convidado", 18). Quando você cria um objeto com new Person(), o construtor sem parâmetros é chamado, mas ele imediatamente passa o controle para o construtor com dois parâmetros, passando os valores "Convidado" e 18. Assim, toda a lógica de inicialização fica em um único lugar.

\n\n

2. Palavra-chave base — chamar um construtor da classe base

\n\n

Se sua classe herda de outra classe, você pode chamar o construtor da classe base usando base. Isso garante que a parte base do objeto seja inicializada corretamente.

\n\n

Exemplo: a classe base Animal e a classe derivada Dog.

\n\n
public class Animal\n{\n    public string Species { get; set; }\n\n    public Animal(string species)\n    {\n        Species = species;\n    }\n}\n\npublic class Dog : Animal\n{\n    public string Breed { get; set; }\n\n    // Construtor de Dog chama o construtor de Animal\n    public Dog(string breed) : base("Cachorro")\n    {\n        Breed = breed;\n    }\n}
\n\n

Aqui, : base("Cachorro") diz ao compilador: "Primeiro execute o construtor da classe base Animal com o argumento 'Cachorro', depois continue a inicialização de Dog". Sem isso, você receberia um erro de compilação, pois Animal não possui um construtor padrão.

\n\n

Exemplo real: uma pergunta popular do Stack Overflow

\n\n

Imagine que você está trabalhando em um aplicativo de loja online. Você tem uma classe Order que pode ser criada de diferentes formas: com o ID do cliente, com um conjunto completo de dados ou sem parâmetros (para testes).

\n\n
public class Order\n{\n    public int OrderId { get; set; }\n    public int CustomerId { get; set; }\n    public decimal TotalAmount { get; set; }\n    public DateTime CreatedDate { get; set; }\n\n    // Construtor sem parâmetros — para testes\n    public Order() : this(0, 0, 0)\n    {\n    }\n\n    // Construtor com dados mínimos\n    public Order(int customerId, decimal totalAmount) : this(0, customerId, totalAmount)\n                

Blogs

Book Recommendations