Tipos aninhados
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.
Um tipo aninhado é um tipo definido dentro do escopo de outro tipo, que é chamado de tipo de delimitador. Um tipo aninhado tem acesso a todos os membros do respectivo tipo de delimitador. Por exemplo, ele tem acesso a campos privados definidos no tipo de delimitador e a campos protegidos definidos em todos os ascendentes do tipo de delimitador.
Em geral, os tipos aninhados devem ser usados com moderação. Há vários motivos para isso. Alguns desenvolvedores não estão totalmente familiarizados com o conceito. Esses desenvolvedores podem, por exemplo, ter problemas com a sintaxe de declarar variáveis de tipos aninhados. Os tipos aninhados também são muito firmemente associados aos seus tipos de delimitador e, como tal, não são adequados como tipos de uso geral.
Os tipos aninhados são mais adequados para modelar detalhes de implementação de seus tipos de delimitador. O usuário final raramente tem que declarar variáveis de um tipo aninhado, e quase nunca deve ter que instanciar explicitamente tipos aninhados. Por exemplo, o enumerador de uma coleção pode ser um tipo aninhado dessa coleção. Os enumeradores geralmente são instanciados pelo tipo de conexão e, como muitas linguagens dão suporte à instrução foreach, as variáveis de enumerador raramente precisam ser declaradas pelo usuário final.
✔️ USE tipos aninhados quando a relação entre o tipo aninhado e seu tipo externo for tal que a semântica de acessibilidade de membros seja desejável.
❌ NÃO use tipos aninhados públicos como um constructo de agrupamento lógico; use namespaces para isso.
❌ EVITE tipos aninhados expostos publicamente. A única exceção a isso é se variáveis do tipo aninhado precisarem ser declaradas apenas em cenários raros, como subclasse ou outros cenários avançados de personalização.
❌ NÃO use tipos aninhados se o tipo provavelmente for referenciado fora do tipo que o contém.
Por exemplo, uma enumeração passada para um método definido em uma classe não deve ser definida como um tipo aninhado na classe.
❌ NÃO use tipos aninhados se eles precisarem ser instanciados pelo código do cliente. Se um tipo tiver um construtor público, ele provavelmente não deve ser aninhado.
Se um tipo puder ser instanciado, isso parece indicar que o tipo tem um lugar na estrutura por conta própria (você pode criá-lo, trabalhar com ele e destruí-lo sem nunca usar o tipo externo) e, portanto, não deve ser aninhado. Os tipos internos não devem ser amplamente reutilizados fora do tipo externo sem qualquer relação com o tipo externo.
❌ NÃO defina um tipo aninhado como membro de uma interface. Há muitas linguagens que não dão suporte a esse constructo.
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.