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.

Confira também