I tipi nidificati non devono essere visibili

Aggiornamento: novembre 2007

TypeName

NestedTypesShouldNotBeVisible

CheckId

CA1034

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un tipo visibile esternamente contiene una dichiarazione di tipo visibile esternamente. Enumeratori e tipi protetti nidificati non sono interessati da questa regola.

Descrizione della regola

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

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

I tipi nidificati 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 nidificati negli scenari di personalizzazione avanzata.

Correzione di violazioni

Se non si desidera che il tipo nidificato sia visibile esternamente, modificare l'accessibilità del tipo. In caso contrario rimuovere il tipo nidificato dall'elemento padre. Se lo scopo della nidificazione è quello di assegnare una categoria al tipo nidificato, 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();
        }
    };
}