Projeto do construtor
Nota
Este conteúdo é reimpresso com permissão da Pearson Education, Inc., a partir 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 revisto na terceira edição. Algumas das informações nesta página podem estar desatualizadas.
Existem 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.
Os construtores de tipo não podem usar nenhum parâmetro. Os construtores de instância podem. Os construtores de instância que não usam nenhum parâmetro são frequentemente chamados de construtores sem parâmetros.
Os 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 maneiras 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 enums. Tais 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 parecer antinatural.
✔️ DO usa parâmetros do construtor como atalhos para definir as propriedades principais.
Não deve haver diferença na semântica entre usar o construtor vazio seguido por alguns conjuntos de propriedades e usar um construtor com vários argumentos.
✔️ DO use o mesmo nome para parâmetros do 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 invólucro.
✔️ FAÇA um trabalho mínimo no construtor.
Os construtores não devem fazer muito trabalho além de capturar os parâmetros do construtor. O custo de qualquer outro processamento deve ser adiado até ser necessário.
✔️ DO lança exceções de construtores de instância, se apropriado.
✔️ DO declara explicitamente o construtor sem parâmetros público em classes, se tal construtor for necessário.
Se você não declarar explicitamente nenhum construtor em um tipo, muitas linguagens (como C#) adicionarão automaticamente um construtor sem parâmetros público. (As classes abstratas obtêm um construtor protegido.)
Adicionar um construtor parametrizado a uma classe impede que o compilador adicione o construtor sem parâmetros. Isto provoca frequentemente alterações acidentais de rutura.
❌ EVITE definir explicitamente construtores sem parâmetros em structs.
Isso torna a criação de array mais rápida, porque se o construtor sem parâmetros não estiver 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.
Type Constructor Guidelines
✔️ DO tornar 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 quaisquer membros estáticos nesse tipo sejam chamados. O usuário não tem controle sobre quando o construtor estático é chamado. Se um construtor estático não é privado, ele pode ser chamado por código diferente do CLR. Dependendo das operações executadas 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 lançada de um construtor type, o tipo não será utilizável no domínio do aplicativo atual.
✔️ CONSIDERE inicializar campos estáticos embutidos em vez de usar explicitamente construtores estáticos, porque o tempo de execução é capaz de otimizar o desempenho de tipos que não têm um construtor estático explicitamente definido.
© Partes 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc., de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da Microsoft Windows Development Series.