Domanda

Sono in esecuzione analisi statica del codice con FxCop 1,36 e continuo a ricevere avvertimento CA1034 : NestedTypesShouldNotBeVisible.

Vorrei capire se la classe genitore sono stati dichiarati come interno o privato, ma è pubblica. Perché sarebbe un male per TimerReset da dichiarare pubblico?

Mi manca qualcosa, o si tratta di qualcosa che può essere ignorato?

Grazie per ogni ingresso!

Ecco un estratto del codice causa questo avvertimento:

namespace Company.App.Thing
{
    public partial class Page : XtraPage
    {
        public delegate void TimerResetDelegate(object sender, EventArgs e);
        private TimerResetDelegate _timerReset;

        public Page()
        {
            InitializeComponent();
        }

        public TimerResetDelegate TimerReset
        {
            set
            {
                if (null != (_timerReset = value))
                {
                    checkBox.Click += new EventHandler(_timerReset);
                    textField.Click += new EventHandler(_timerReset);
                    textField.KeyDown += new KeyEventHandler(_timerReset);
                    TimeField.Click += new EventHandler(_timerReset);
                    TimeField.KeyDown += new KeyEventHandler(_timerReset);
                }
            }
        }
    }
}
È stato utile?

Soluzione

In linea generale, Tipi nidificati sono più difficili da 'scoprire'.

es. Per utilizzare il tipo nidificato, dovrò scrivere dopo

Page.TimerResetDelegate timer = new Page.TimerResetDelegate();

Anche se sopra è valido codice C #, che non legge, come il solito utilizzo tipo.

tipi nidificati sono generalmente utilizzati quando si vuole definire un tipo da utilizzare internamente e si dovrebbe evitare di codice come sopra. Questo è il motivo per cui FxCop ti dà avvertimento. Se si desidera, è possibile ignorarlo. Personalmente, vorrei mantenere i miei tipi nidificati come private. Se mi aspetto chiamante di fare uso di tipo, io li passare a una vera e propria dello spazio dei nomi.

Altri suggerimenti

E 'perché il delegato è un tipo, ma è definita all'interno della classe Page. Vorrei solo definisco nello spazio dei nomi Company.App.Thing, ma non è un problema davvero. Se si stesse scrivendo un'API sarebbe solo fare un po 'disordinato, questo è tutto.

Inoltre, è un po 'strano per restituire il delegato del genere, ma credo che non so davvero che cosa si sta cercando di realizzare.

  

Perché sarebbe un male per TimerReset da dichiarare pubblico?

Esattamente come il descrizione stati :

  

tipi nidificati sono utili per incapsulare i dettagli di implementazione private del tipo che contiene. Utilizzato per questo scopo, i tipi annidati non dovrebbero essere visibili esternamente.

Dato che si sta esponendo TimerResetDelegate pubblicamente con TimerReset, immagino che non è un dettaglio di implementazione.

  

Non utilizzare tipi nidificati visibili esternamente per il raggruppamento logico o per evitare collisioni; invece, utilizzare gli spazi dei nomi.

Il che lo fa apparire come si sta utilizzando un tipo nidificato per il raggruppamento. Come afferma FxCop, utilizzare uno spazio dei nomi.

  

tipi nidificati includono la nozione di membro di accessibilità, che alcuni programmatori non capiscono chiaramente.

Dato TimerResetDelegate è un delegato, questo non si applica in realtà.

Sposta TimerResetDelegate ad un suo file TimeResetDelegate.cs, e metterlo nello spazio dei nomi Company.App.Thing. Poi, non è più nidificato.

Naturalmente, sarebbe ancora meglio andare solo con EventHandler invece di definire il proprio tipo delegato.

secondo me, questa è una regola FxCop che può essere ignorato.

Non c'è niente di male da un livello CLR di avere una classe annidata. E 'solo una regola di guida aggiunto FxCop perché gli autori hanno ritenuto che era meno utilizzabile o un disegno più poveri di rendere la classe non annidata.

A quanto pare non piace l'idea di classi nidificate, quando potrebbero essere utilizzati al di fuori del contesto della classe pagina.

Personalmente sono d'accordo con questo in linea di principio, anche se posso immaginare alcune eccezioni in cui potrebbe essere auspicabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top