Por que isso é importante: um construtor é bom, mas dois é melhor
\n\nVocê 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\nComo funciona a chamada de um construtor a partir de outro em C#
\n\nEm 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.
1. Palavra-chave this — chamar um construtor na mesma classe
\n\nQuando 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.
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.
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\nNeste 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.
2. Palavra-chave base — chamar um construtor da classe base
\n\nSe 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.
Exemplo: a classe base Animal e a classe derivada Dog.
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\nAqui, : 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.
Exemplo real: uma pergunta popular do Stack Overflow
\n\nImagine 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).
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