Partager via


Les types imbriqués ne doivent pas être visibles

Mise à jour : novembre 2007

TypeName

NestedTypesShouldNotBeVisible

CheckId

CA1034

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

Un type visible de l'extérieur contient une déclaration d'un type visible de l'extérieur. Les énumérateurs imbriqués et les types protégés 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 de l'extérieur pour le regroupement logique ou pour éviter des collisions de noms ; utilisez plutôt des espaces de noms.

Les types imbriqués incluent la notion d'accessibilité des membres, que quelques 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ée.

Comment corriger les violations

Si vous ne souhaitez pas que le type imbriqué soit visible de l'extérieur, modifiez l'accessibilité du type. Sinon, éliminez le type imbriqué de son parent. Si le but de l'imbrication consiste à catégoriser le type imbriqué, utilisez plutôt un espace de noms pour créer une hiérarchie.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant présente un type qui ne respecte pas la règle.

Imports System

Namespace DesignLibrary

    Class ParentType

        Public Class NestedType
            Sub New()
            End Sub
        End Class

        Sub New()
        End Sub

    End Class

End Namespace
using System;

namespace DesignLibrary
{
    internal class ParentType
    {
        public class NestedType
        {
            public NestedType()
            {
            }
        }

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

namespace DesignLibrary
{
    public ref class ParentType
    {
    public:
        ref class NestedType
        {
        public:
            NestedType()
            {
            }
        };

        ParentType()
        {
            NestedType^ nt = gcnew NestedType();
        }
    };
}