Partage via


CA1034 : Les types imbriqués ne doivent pas être visibles

Propriété Value
Identificateur de la règle CA1034
Titre Les types imbriqués ne doivent pas être visibles
Catégorie Conception
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Non

Cause

Un type visible en externe contient une déclaration de type visible en externe. Les énumérations imbriquées, les types protégés et les modèles de générateur sont exemptés de cette règle.

Description de la règle

Un type imbriqué représente un type déclaré dans la portée d’un autre type. Les types imbriqués sont utiles pour encapsuler les détails de l’implémentation privée du type conteneur. Utilisés à cette fin, les types imbriqués ne doivent pas être visibles de l'extérieur.

N’utilisez pas de types imbriqués visibles en externe pour le regroupement logique ou pour éviter les collisions de noms ; à la place, utilisez des espaces de noms.

Les types imbriqués incluent la notion d’accessibilité des membres, que certains programmeurs ne comprennent pas clairement.

Les types protégés peuvent être utilisés dans les sous-classes et les types imbriqués dans des scénarios de personnalisation avancés.

Comment corriger les violations

Si vous ne souhaitez pas que le type imbriqué soit visible en externe, modifiez l’accessibilité du type. Sinon, supprimez le type imbriqué de son parent. Si l’objectif de l’imbrication est de catégoriser le type imbriqué, utilisez plutôt un espace de noms pour créer la hiérarchie.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L’exemple suivant montre un type qui enfreint la règle.

public class ParentType
{
    public class NestedType
    {
        public NestedType()
        {
        }
    }

    public ParentType()
    {
        NestedType nt = new NestedType();
    }
}
Imports System

Namespace ca1034

    Class ParentType

        Public Class NestedType
            Sub New()
            End Sub
        End Class

        Sub New()
        End Sub

    End Class

End Namespace