Condividi tramite


CA1034: I tipi annidati non devono essere visibili

TypeName

NestedTypesShouldNotBeVisible

CheckId

CA1034

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un tipo visibile esternamente contiene una dichiarazione di tipo visibile esternamente. Le enumerazioni e i tipi protetti annidati non sono interessati da questa regola.

Descrizione della regola

Un tipo annidato è un tipo dichiarato all'interno dell'ambito di un altro tipo. I tipi annidati sono utili per incapsulare dettagli di implementazione privati del tipo contenitore. I tipi annidati utilizzati per questo scopo non devono essere visibili esternamente.

Evitare di utilizzare tipi annidati visibili esternamente per raggruppamenti logici o per evitare conflitti di nomi, utilizzare invece spazi dei nomi.

I tipi annidati includono la nozione di accessibilità del membro, che non viene compresa chiaramente da alcuni programmatori.

I tipi protetti possono essere utilizzati in sottoclassi e i tipi annidati negli scenari di personalizzazione avanzata.

Come correggere le violazioni

Se non si desidera che il tipo annidato sia visibile esternamente, modificare l'accessibilità del tipo. In caso contrario rimuovere il tipo annidato dall'elemento padre. Se lo scopo dell'annidamento è quello di assegnare una categoria al tipo annidato, utilizzare in sostituzione uno spazio dei nomi per creare la gerarchia.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che viola la regola.

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();
        }
    };
}