Ich organisiere ein Bibliotheksprojekt und habe eine zentrale Manager-Klasse mit dem Namen Scenegraph
und eine ganze Reihe anderer Klassen, die im Scenegraph-Namespace leben.
Was ich wirklich möchte, ist, dass der Szenegraph MyLib.Scenegraph
und die anderen Klassen sind MyLib.Scenegraph.*
, aber es scheint die einzige Möglichkeit zu sein, alle anderen Klassen zu inneren Klassen Scenegraph
in der Datei Scenegraph.cs zu machen, und das ist einfach zu unhandlich .
Stattdessen habe ich es als Mylib.Scenegraph.Scenegraph
und organisiert MyLib.Scenegraph.*
, welche Art von Arbeit, aber ich finde, dass Visual Studio unter bestimmten Bedingungen verwirrt ist, ob ich mich auf die Klasse oder den Namespace beziehe.
Gibt es eine gute Möglichkeit, dieses Paket so zu organisieren, dass es für Benutzer bequem ist, ohne meinen gesamten Code in einem nicht zu wartenden Durcheinander zusammenzufassen?
quelle
using Foo.Bar;
späterBar b
ganz klar aufBar
eine Klasse (oder Aufzählung) innerhalb des NamespaceFoo.Bar
. Der wahre Grund, dies nicht zu tun, ist lediglich, dass der C # -Compiler es nicht richtig versteht, was schrecklich überraschend und unglücklich ist. Alles andere ist ein Ratschlag im Wollstil.Wenn Sie dem Namespace und der Klasse denselben Namen geben, kann dies den Compiler verwirren, wie andere gesagt haben.
Wie soll man es dann benennen?
Wenn der Namespace mehrere Klassen hat, suchen Sie einen Namen, der alle diese Klassen definiert.
Wenn der Namespace nur eine Klasse hat (und daher die Versuchung, ihm denselben Namen zu geben), benennen Sie den Namespace ClassName NS . So benennt Microsoft zumindest ihre Namespaces.
quelle
Ich würde vorschlagen, dass Sie den Rat befolgen, den ich verwendet habe
microsoft.public.dotnet.languages.csharp
,MyLib.ScenegraphUtil.Scenegraph
undMyLib.ScenegraphUtil.*
.quelle
CA1724: Type Names Should Not Match Namespaces
...Wenn Sie der Codeanalyse folgen, um eine ordnungsgemäße Codierung zu gewährleisten, lautet diese Regel grundsätzlich, nicht das zu tun, was Sie versuchen. Die Codeanalyse ist sehr nützlich , um potenzielle Probleme zu finden.
quelle
Nur meine 2 Cent hinzufügen:
Ich hatte folgende Klasse:
Der Client wurde folgendermaßen geschrieben:
Da der Fehler GetFoo die Ausgabe nicht zurückgibt, anstatt den Parameter out zu verwenden, konnte der Compiler den Datentyp Foo.Bar [] nicht auflösen. Es wurde der Fehler zurückgegeben: Typ oder Namespace Foo.Bar konnte nicht gefunden werden.
Es scheint, dass beim Versuch, es zu kompilieren, Foo als Klasse aufgelöst wurde und keine eingebettete Klassenleiste in der Klasse Foo gefunden wurde. Es konnte auch kein Namespace namens Foo.Bar gefunden werden. Es konnte keine Klassenleiste im Namespace Foo gesucht werden. Die Punkte in einem Namensraum sind NICHT syntaktisch. Die gesamte Zeichenfolge ist ein Token, nicht die durch die Punkte begrenzten Wörter.
Dieses Verhalten wurde von VS 2015 mit .Net 4.6 gezeigt
quelle
Auch wenn ich anderen Antworten darin zustimme, dass Sie Ihre Klasse nicht wie Ihren Namespace benennen sollten, gibt es Zeiten, in denen Sie solche Anforderungen nicht erfüllen können.
In meinem Fall war ich zum Beispiel nicht die Person, die eine solche Entscheidung traf, deshalb musste ich einen Weg finden, damit es funktioniert.
Für diejenigen, die weder den Namespace-Namen noch den Klassennamen ändern können, ist dies eine Möglichkeit, Ihren Code zum Laufen zu bringen.
Grundsätzlich habe ich Namespace- "Aliase" erstellt, wodurch ich die Klasse vollständig qualifizieren konnte und die "Verwirrung" in Visual Studio verschwand.
HINWEIS: Sie sollten diesen Namenskonflikt vermeiden, wenn Sie dies in Ihrem Steuerelement tun. Sie sollten die erwähnte Technik nur verwenden, wenn Sie nicht die Kontrolle über die betreffenden Klassen und Namespaces haben.
quelle
Alter Beitrag, aber hier gehe ich mit einer anderen Idee, die jemandem helfen könnte:
"... aber es scheint die einzige Möglichkeit zu sein, alle anderen Klassen zu inneren Klassen von Scenegraph in der Datei Scenegraph.cs zu machen, und das ist einfach zu unhandlich."
Dies ist wirklich die bessere Implementierung für eine Reihe von Szenarien. Ich stimme jedoch zu, dass es ärgerlich ist, den gesamten Code in derselben CS-Datei zu haben (gelinde gesagt).
Sie können das Problem lösen, indem Sie die Basisklasse zu einer "Teilklasse" machen und dann die inneren Klassen in ihren eigenen Dateien erstellen (denken Sie daran, dass sie das Basisklassenkomplement deklarieren und dann mit der spezifischen inneren Klasse fortfahren müssen für diese Datei).
Etwas wie...
Scenegraph.cs:
DependentClass.cs:
Ich denke, dass dies der nächste Schritt ist, um die saubere Implementierung innerer Klassen zu erreichen, ohne alles in einer riesigen und unordentlichen Datei überladen zu müssen.
quelle
Wie andere bereits gesagt haben, empfiehlt es sich, eine Klasse nicht so zu benennen wie ihren Namespace.
Hier sind einige zusätzliche Namensvorschläge aus einer Antwort von svick auf eine verwandte Frage "Gleicher Klassen- und Namespace-Name" im Software Engineering Stack Exchange:
(Beachten Sie, dass die oben genannte Antwort Verwendungen
Model.DataSource.DataSource
,Model.QueryStorage.QueryStorage.
undModel.Project.Project
als Beispiele stattMyLib.Scenegraph.Scenegraph
.)(Ich fand auch die anderen Namensvorschläge in den anderen Antworten hier hilfreich.)
quelle
Es passiert, wenn es die Hauptklasse des Namespace ist. Es ist also eine Motivation, den Namespace in eine Bibliothek zu stellen. Dann verschwindet das Problem, wenn Sie dem Namespace-Namen 'Lib' hinzufügen ...
quelle