CA1034 : Les types imbriqués ne doivent pas être visiblesCA1034: Nested types should not be visible

TypeNameTypeName NestedTypesShouldNotBeVisibleNestedTypesShouldNotBeVisible
CheckIdCheckId CA1034CA1034
CategoryCategory Microsoft.DesignMicrosoft.Design
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Un type visible de l’extérieur contient une déclaration de type visible de l’extérieur.An externally visible type contains an externally visible type declaration. Les énumérations imbriquées et les types protégés sont exemptés de cette règle.Nested enumerations and protected types are exempt from this rule.

Description de la règleRule description

Un type imbriqué est un type déclaré dans l’étendue d’un autre type.A nested type is a type declared within the scope of another type. Les types imbriqués sont utiles pour encapsuler les détails d’implémentation privée du type conteneur.Nested types are useful for encapsulating private implementation details of the containing type. Utilisés à cette fin, les types imbriqués ne doivent pas être visibles de l'extérieur.Used for this purpose, nested types should not be externally visible.

N’utilisez pas les types imbriqués extérieurement visibles pour le regroupement logique ou pour éviter les collisions de nom ; au lieu de cela, utilisez des espaces de noms.Do not use externally visible nested types for logical grouping or to avoid name collisions; instead, use namespaces.

Les types imbriqués incluent la notion d’accessibilité des membres, certains programmeurs ne comprennent pas clairement.Nested types include the notion of member accessibility, which some programmers do not understand clearly.

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.Protected types can be used in subclasses and nested types in advance customization scenarios.

Comment corriger les violationsHow to fix violations

Si vous n’envisagez pas de type imbriqué à être visible de l’extérieur, modifiez l’accessibilité du type.If you do not intend the nested type to be externally visible, change the type's accessibility. Sinon, supprimez le type imbriqué de son parent.Otherwise, remove the nested type from its parent. Si l’objectif de l’imbrication consiste à catégoriser le type imbriqué, utilisez un espace de noms pour créer la hiérarchie à la place.If the purpose of the nesting is to categorize the nested type, use a namespace to create the hierarchy instead.

Quand supprimer les avertissementsWhen to suppress warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule.

ExempleExample

L’exemple suivant montre un type qui viole la règle.The following example shows a type that violates the rule.

using namespace System;

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

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

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

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

Namespace DesignLibrary

    Class ParentType

        Public Class NestedType
            Sub New()
            End Sub
        End Class

        Sub New()
        End Sub

    End Class

End Namespace