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