Tipos anidados (Guía de programación de C#)

Un tipo definido en una clase, estructura o interfaz se denomina tipo anidado. Por ejemplo

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

Con independencia de si el tipo externo es una clase, una interfaz o una estructura, los tipos anidados se establecen de manera predeterminada en private; solo son accesibles desde su tipo contenedor. En el ejemplo anterior, la clase Nested es inaccesible a los tipos externos.

También puede especificar un modificador de acceso para definir la accesibilidad de un tipo anidado, de la manera siguiente:

  • Los tipos anidados de una clase pueden ser public, protected, internal, protected internal, private o private protected.

    En cambio, al definir una clase anidada protected, protected internal o private protected dentro de una clase sellada, se genera una advertencia del compilador CS0628, "Nuevo miembro protegido declarado en la clase sealed".

    Tenga en cuenta también que la creación de un tipo anidado externamente visible infringe la regla de calidad del código CA1034 "Los tipos anidados no deben ser visibles".

  • Los tipos anidados de un struct pueden ser public, internal o private.

En el ejemplo siguiente se convierte la clase Nested en public:

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

El tipo anidado o interno puede tener acceso al tipo contenedor o externo. Para tener acceso al tipo contenedor, páselo como un argumento al constructor del tipo anidado. Por ejemplo:

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

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

Un tipo anidado tiene acceso a todos los miembros que estén accesibles para el tipo contenedor. Puede tener acceso a los miembros privados y protegidos del tipo contenedor, incluidos los miembros protegidos heredados.

En la declaración anterior, el nombre completo de la clase Nested es Container.Nested. Este es el nombre que se utiliza para crear una instancia nueva de la clase anidada, de la siguiente manera:

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

Consulte también