Partilhar via


Tipos aninhados (Guia de Programação em C#)

Um tipo definido dentro de uma classe, struct ou interface é chamado de tipo aninhado. Por exemplo

public class Container
{
    class Nested
    {
        Nested() { }
    }
}

Independentemente de o tipo externo ser uma classe, interface ou estrutura, os tipos aninhados têm, por padrão, o modificador de acesso privado; são acessíveis apenas a partir do tipo que os contém. No exemplo anterior, a classe Nested é inacessível para tipos externos.

Você também pode especificar um modificador de acesso para definir a acessibilidade de um tipo embutido, da seguinte maneira:

  • Os tipos aninhados de uma classe podem ser públicos, protegidos, internos, protegidos internos, privados ou privados.

    No entanto, definir uma protectedclasse , protected internal ou private protected aninhada dentro de uma classe selada gera aviso do compilador CS0628, "novo membro protegido declarado em classe selada".

    Lembre-se também de que tornar um tipo aninhado visível externamente viola a regra de qualidade de código CA1034 "Tipos aninhados não devem ser visíveis".

  • Os tipos aninhados de uma estrutura podem ser públicos, internos ou privados.

O exemplo a seguir torna pública a classe Nested:

public class Container
{
    public class Nested
    {
        Nested() { }
    }
}

O tipo aninhado, ou interno, pode aceder ao tipo envolvente, ou externo. Para aceder ao tipo contido, passe-o como argumento para o construtor do tipo interno. Por exemplo:

public class Container
{
    public class Nested
    {
        private Container? parent;

        public Nested()
        {
        }
        public Nested(Container parent)
        {
            this.parent = parent;
        }
    }
}

Um tipo aninhado tem acesso a todos os membros que são acessíveis ao seu tipo recipiente. Ele pode acessar membros privados e protegidos do tipo que contém, incluindo quaisquer membros protegidos herdados.

Na declaração anterior, o nome completo da classe Nested é Container.Nested. Este é o nome usado para criar uma nova instância da classe aninhada, da seguinte maneira:

Container.Nested nest = new Container.Nested();

Ver também