Secondo la documentazione StyleCop:
SA1200: UsingDirectivesMustBePlacedWithinNamespace
Causa AC # utilizzando la direttiva viene posizionato all'esterno di un elemento dello spazio dei nomi.
Descrizione della regola Una violazione di questa regola si verifica quando una direttiva using o una using-alias viene posizionata all'esterno di un elemento dello spazio dei nomi, a meno che il file non contenga elementi dello spazio dei nomi.
Ad esempio, il codice seguente comporterebbe due violazioni di questa regola.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
Il codice seguente, tuttavia, non comporterebbe alcuna violazione di questa regola:
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
Questo codice verrà compilato in modo pulito, senza errori di compilazione. Tuttavia, non è chiaro quale versione del tipo Guid venga allocata. Se la direttiva using viene spostata all'interno dello spazio dei nomi, come mostrato di seguito, si verificherà un errore del compilatore:
namespace Microsoft.Sample
{
using Guid = System.Guid;
public class Guid
{
public Guid(string s)
{
}
}
public class Program
{
public static void Main(string[] args)
{
Guid g = new Guid("hello");
}
}
}
Il codice non riesce al seguente errore del compilatore, trovato nella riga contenente Guid g = new Guid("hello");
CS0576: Lo spazio dei nomi "Microsoft.Sample" contiene una definizione in conflitto con l'alias "Guid"
Il codice crea un alias per il tipo System.Guid chiamato Guid e crea anche un proprio tipo chiamato Guid con un'interfaccia di costruzione corrispondente. Successivamente, il codice crea un'istanza del tipo Guid. Per creare questa istanza, il compilatore deve scegliere tra le due diverse definizioni di Guid. Quando la direttiva using-alias viene posizionata all'esterno dell'elemento namespace, il compilatore sceglierà la definizione locale di Guid definita all'interno dello spazio dei nomi locale e ignorerà completamente la direttiva using-alias definita al di fuori dello spazio dei nomi. Questo, sfortunatamente, non è ovvio quando si legge il codice.
Quando la direttiva using-alias è posizionata all'interno dello spazio dei nomi, tuttavia, il compilatore deve scegliere tra due diversi tipi Guid, in conflitto, entrambi definiti nello stesso spazio dei nomi. Entrambi questi tipi forniscono un costruttore corrispondente. Il compilatore non è in grado di prendere una decisione, quindi contrassegna l'errore del compilatore.
Posizionare la direttiva using-alias al di fuori dello spazio dei nomi è una cattiva pratica perché può creare confusione in situazioni come questa, dove non è ovvio quale versione del tipo sia effettivamente utilizzata. Questo può potenzialmente portare a un bug che potrebbe essere difficile da diagnosticare.
Il posizionamento di direttive using-alias all'interno dell'elemento namespace elimina ciò come fonte di bug.
- Più spazi dei nomi
Posizionare più elementi dello spazio dei nomi all'interno di un singolo file è generalmente una cattiva idea, ma se e quando ciò è fatto, è una buona idea posizionare tutti usando le direttive all'interno di ciascuno degli elementi dello spazio dei nomi, piuttosto che globalmente nella parte superiore del file. Ciò consentirà di individuare strettamente gli spazi dei nomi e aiuterà anche a evitare il tipo di comportamento descritto sopra.
È importante notare che quando il codice è stato scritto utilizzando direttive posizionate al di fuori dello spazio dei nomi, è necessario prestare attenzione quando si spostano queste direttive all'interno dello spazio dei nomi, per assicurarsi che ciò non cambi la semantica del codice. Come spiegato sopra, l'inserimento delle direttive using-alias all'interno dell'elemento namespace consente al compilatore di scegliere tra tipi in conflitto in modi che non accadranno quando le direttive vengono posizionate al di fuori dello spazio dei nomi.
Come correggere le violazioni Per correggere una violazione di questa regola, spostare tutte le direttive using e using-alias all'interno dell'elemento namespace.