Design do construtor
Observação
Este conteúdo é reimpresso com permissão da Pearson Education, Inc. de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Essa edição foi publicada em 2008 e, desde então, o livro foi totalmente revisado na terceira edição. Algumas das informações nesta página podem estar desatualizadas.
Há dois tipos de construtores: construtores de tipo e construtores de instância.
Os construtores de tipo são estáticos e são executados pelo CLR antes que o tipo seja usado. Os construtores de instância são executados quando uma instância de um tipo é criada.
Construtores de tipo não podem usar parâmetros. Os construtores de instância podem. Construtores de instância que não tomam parâmetros geralmente são chamados de construtores sem parâmetros.
Construtores são a maneira mais natural de criar instâncias de um tipo. A maioria dos desenvolvedores pesquisará e tentará usar um construtor antes de considerar formas alternativas de criar instâncias (como métodos de fábrica).
✔️ CONSIDERE fornecer construtores simples, idealmente padrão.
Um construtor simples tem um número muito pequeno de parâmetros e todos os parâmetros são primitivos ou enumerações. Esses construtores simples aumentam a usabilidade da estrutura.
✔️ CONSIDERE o uso de um método de fábrica estático em vez de um construtor se a semântica da operação desejada não for mapeada diretamente para a construção de uma nova instância ou se seguir as diretrizes de design do construtor não parecer natural.
✔️ USE parâmetros de construtor como atalhos para definir as propriedades principais.
Não deve haver diferença na semântica entre o uso do construtor vazio seguido por alguns conjuntos de propriedades e o uso de um construtor com vários argumentos.
✔️ USE o mesmo nome para parâmetros de construtor e uma propriedade se os parâmetros do construtor forem usados para simplesmente definir a propriedade.
A única diferença entre esses parâmetros e as propriedades deve ser o uso de maiúsculas e minúsculas.
✔️ FAÇA um trabalho mínimo no construtor.
Os construtores não devem trabalhar muito além de capturar os parâmetros do construtor. O custo de qualquer outro processamento deve ser adiado até que seja necessário.
✔️ GERE exceções de construtores de instância, se apropriado.
✔️ DECLARE explicitamente o construtor público sem parâmetros em classes, se esse construtor for necessário.
Se você não declarar explicitamente nenhum construtor em um tipo, muitos idiomas (como C#) adicionarão automaticamente um construtor público sem parâmetros. (Classes abstratas obtêm um construtor protegido.)
Adicionar um construtor parametrizado a uma classe impede que o compilador adicione o construtor sem parâmetros. Isso geralmente causa alterações interruptivas acidentais.
❌ EVITE definir explicitamente construtores sem parâmetros em structs.
Isso torna a criação de matriz mais rápida, pois se o construtor sem parâmetros não for definido, ele não precisará ser executado em todos os slots da matriz. Observe que muitos compiladores, incluindo C#, não permitem que structs tenham construtores sem parâmetros por esse motivo.
❌ EVITE chamar membros virtuais em um objeto dentro de seu construtor.
Chamar um membro virtual fará com que a substituição mais derivada seja chamada, mesmo que o construtor do tipo mais derivado ainda não tenha sido totalmente executado.
Diretrizes do construtor de tipo
✔️ TORNE os construtores estáticos privados.
Um construtor estático, também chamado de construtor de classe, é usado para inicializar um tipo. O CLR chama o construtor estático antes que a primeira instância do tipo seja criada ou que outros membros estáticos nesse tipo sejam chamados. O usuário não tem controle sobre quando o construtor estático é chamado. Se não for privado, um construtor estático poderá ser chamado por um código diferente do CLR. Dependendo das operações realizadas no construtor, isso pode causar um comportamento inesperado. O compilador C# força os construtores estáticos a serem privados.
❌ NÃO lance exceções de construtores estáticos.
Se uma exceção for gerada de um construtor de tipo, o tipo não poderá ser usado no domínio do aplicativo atual.
✔️ CONSIDERE inicializar campos estáticos embutidos em vez de usar explicitamente construtores estáticos, pois o runtime é capaz de otimizar o desempenho de tipos que não têm um construtor estático definido explicitamente.
Portions © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc. das Diretrizes de Design do Framework: convenções, linguagens e padrões para bibliotecas do .NET reutilizável, 2ª edição por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da série de desenvolvimento do Microsoft Windows.