Types imbriqués (guide de programmation C#)

Un type défini dans une classe, un struct ou une interface est appelé « type imbriqué ». Par exemple

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

Que le type externe soit une classe ou un struct, les types imbriqués sont par défaut privés ; ils sont accessibles uniquement à partir de leur type de conteneur. Dans l’exemple précédent, la classe Nested est inaccessible aux types externes.

Vous pouvez aussi spécifier un modificateur d’accès pour définir l’accessibilité d’un type imbriqué, comme ceci :

  • Les types imbriqués d’une classe peuvent être public, protected, internal, protected internal, private ou private protected.

    Cependant, le fait de définir une classe imbriquée protected, protected internal ou private protected à l’intérieur d’une classe sealed a pour effet de générer l’avertissement de compilateur CS0628, « nouveau membre protected déclaré dans une classe sealed ».

    Sachez également que rendre un type imbriqué visible en externe enfreint la règle de qualité du code CA1034 « Les types imbriqués ne doivent pas être visibles ».

  • Les types imbriqués d’un struct peuvent être public, internal ou private.

L’exemple suivant fait passer le type de la classe Nested à public :

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

Le type imbriqué (ou interne) peut accéder au type conteneur (ou externe). Pour accéder au type conteneur, passez-le en tant qu’argument au constructeur du type imbriqué. Par exemple :

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

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

Un type imbriqué a accès à tous les membres qui sont accessibles à son type conteneur. Il peut accéder aux membres privés et protégés du type conteneur, y compris à tous les membres protégés hérités.

Dans la déclaration précédente, le nom complet de classe Nested est Container.Nested. Il s'agit du nom utilisé pour créer une instance de la classe imbriquée, comme suit :

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

Voir aussi