Laut StyleCop-Dokumentation:
SA1200: UsingDirectivesMustBePlacedWithinNamespace
Ursache AC # mit der Direktive wird außerhalb eines Namespace-Elements platziert.
Regelbeschreibung Ein Verstoß gegen diese Regel tritt auf, wenn eine using-Direktive oder eine using-Alias-Direktive außerhalb eines Namespace-Elements platziert wird, es sei denn, die Datei enthält keine Namespace-Elemente.
Der folgende Code würde beispielsweise zu zwei Verstößen gegen diese Regel führen.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
Der folgende Code würde jedoch nicht zu Verstößen gegen diese Regel führen:
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
Dieser Code wird ohne Compilerfehler sauber kompiliert. Es ist jedoch unklar, welche Version des Guid-Typs zugewiesen wird. Wenn die using-Direktive wie unten gezeigt in den Namespace verschoben wird, tritt ein Compilerfehler auf:
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");
}
}
}
Der Code schlägt bei dem folgenden Compilerfehler fehl, der in der Zeile mit gefunden wird Guid g = new Guid("hello");
CS0576: Der Namespace 'Microsoft.Sample' enthält eine Definition, die mit dem Alias 'Guid' in Konflikt steht.
Der Code erstellt einen Alias für den System.Guid-Typ namens Guid und einen eigenen Typ namens Guid mit einer passenden Konstruktorschnittstelle. Später erstellt der Code eine Instanz vom Typ Guid. Um diese Instanz zu erstellen, muss der Compiler zwischen den beiden unterschiedlichen Definitionen von Guid wählen. Wenn die using-Alias-Direktive außerhalb des Namespace-Elements platziert wird, wählt der Compiler die lokale Definition von Guid aus, die im lokalen Namespace definiert ist, und ignoriert die using-Alias-Direktive, die außerhalb des Namespace definiert ist, vollständig. Dies ist beim Lesen des Codes leider nicht ersichtlich.
Wenn die using-Alias-Direktive jedoch im Namespace positioniert ist, muss der Compiler zwischen zwei verschiedenen, widersprüchlichen Guid-Typen wählen, die beide im selben Namespace definiert sind. Beide Typen bieten einen passenden Konstruktor. Der Compiler kann keine Entscheidung treffen und kennzeichnet daher den Compilerfehler.
Das Platzieren der using-alias-Direktive außerhalb des Namespace ist eine schlechte Praxis, da dies in Situationen wie dieser zu Verwirrung führen kann, in denen nicht klar ist, welche Version des Typs tatsächlich verwendet wird. Dies kann möglicherweise zu einem Fehler führen, der möglicherweise schwer zu diagnostizieren ist.
Durch das Platzieren von using-alias-Direktiven im Namespace-Element wird dies als Fehlerquelle beseitigt.
- Mehrere Namespaces
Das Platzieren mehrerer Namespace-Elemente in einer einzelnen Datei ist im Allgemeinen eine schlechte Idee. In diesem Fall empfiehlt es sich jedoch, alle verwendeten Direktiven in jedem der Namespace-Elemente zu platzieren und nicht global am Anfang der Datei. Dies wird die Namespaces eng umrahmen und auch dazu beitragen, das oben beschriebene Verhalten zu vermeiden.
Es ist wichtig zu beachten, dass beim Schreiben von Code unter Verwendung von Anweisungen außerhalb des Namespace beim Verschieben dieser Anweisungen innerhalb des Namespace darauf geachtet werden sollte, dass dadurch die Semantik des Codes nicht geändert wird. Wie oben erläutert, kann der Compiler beim Platzieren von Direktiven mit Alias innerhalb des Namespace-Elements zwischen widersprüchlichen Typen auf eine Weise wählen, die nicht auftritt, wenn die Direktiven außerhalb des Namespace platziert werden.
So beheben Sie Verstöße Um einen Verstoß gegen diese Regel zu beheben, verschieben Sie alle Direktiven und Alias-Direktiven innerhalb des Namespace-Elements.