Ich habe einen C ++ - Hintergrund und verstehe die Antworten auf diese Frage voll und ganz und stimme ihnen zu: Warum wird der Namespace std verwendet? als schlechte Praxis angesehen?
Ich bin erstaunt, dass ich nach einigen Erfahrungen mit C # genau das Gegenteil sehe:
using Some.Namespace;
Wird buchstäblich überall verwendet. Wenn Sie einen Typ verwenden, fügen Sie zuerst eine using-Direktive für seinen Namespace hinzu (falls diese noch nicht vorhanden ist). Ich kann mich nicht erinnern, eine .cs
Datei gesehen zu haben, die nicht damit begonnen hat using System; using System.Collections.Generic; using X.Y.Z; etc...
. Wenn Sie eine neue Datei über den Visual Studio-Assistenten hinzufügen, werden dort automatisch einige mithilfe von Anweisungen hinzugefügt, auch wenn Sie diese möglicherweise überhaupt nicht benötigen. Während Sie in der C ++ - Community im Grunde genommen gelyncht werden, empfiehlt C # dies sogar. Zumindest erscheint es mir so.
Jetzt verstehe ich, dass die Verwendung von Direktiven in C # und C ++ nicht genau dasselbe ist. Ich verstehe auch, dass eines der schlimmsten Dinge, mit denen Sie using namespace
in C ++ arbeiten können, nämlich das Einfügen in eine Header-Datei, aufgrund des Fehlens eines Konzepts für Header-Dateien und in C # kein gleichwertiges Gegenstück hat #include
.
Trotz ihrer Unterschiede dient die Verwendung von Direktiven in C # und C ++ demselben Zweck, der nur die SomeType
ganze Zeit eingegeben werden muss und nicht der viel längere Some.Namespace.SomeType
(in C ++ mit ::
statt .
). Und mit dem gleichen Zweck scheint mir auch die Gefahr dieselbe zu sein: Kollisionen zu benennen.
Im besten Fall führt dies zu einem Kompilierungsfehler, sodass Sie ihn "nur" beheben müssen. Im schlimmsten Fall wird es immer noch kompiliert und der Code macht stillschweigend andere Dinge, als Sie beabsichtigt hatten. Meine Frage lautet also: Warum werden (anscheinend) Direktiven verwendet, die in C # und C ++ als so ungleich schlecht angesehen werden?
Einige Ideen für eine Antwort, die ich habe (keine davon befriedigt mich jedoch wirklich):
Namespaces sind in C # in der Regel viel länger und viel stärker verschachtelt als in C ++ (
std
vs.System.Collection.Generic
). Es gibt also mehr Lust und mehr Gewinn, den Code auf diese Weise zu entrauschen. Aber selbst wenn dies zutrifft, gilt dieses Argument nur, wenn wir uns die Standard-Namespaces ansehen. Benutzerdefinierte können in C # und C ++ einen beliebigen Kurznamen haben.Namespaces scheinen in C # viel "feinkörniger" zu sein als in C ++. Als Beispiel ist in C ++ die gesamte Standardbibliothek enthalten in
std
(plus einige kleine verschachtelte Namensräume wiechrono
) , während in C # Sie habenSystem.IO
,System.Threading
,System.Text
etc. So wird das Risiko von Namenskollisionen mit kleiner. Dies ist jedoch nur ein Bauchgefühl. Ich habe nicht gezählt, wie viele Namen Sie mitusing namespace std
und "importieren"using System
. Auch wenn dies zutrifft, gilt dieses Argument nur für die Standard-Namespaces. Ihre eigenen können sowohl in C # als auch in C ++ so feinkörnig gestaltet werden, wie Sie möchten.
Gibt es mehr Argumente? Ich interessiere mich besonders für aktuelle harte Fakten (falls vorhanden) und nicht so sehr für Meinungen.
Ext(this T t, long l)
, die via aufgerufen wird t.Ext(0)
. Wenn Sie dann einen anderen Namespace hinzufügen, der eine Erweiterungsmethode enthält Ext(this T t, int i)
, wird dieser stattdessen aufgerufen. Aber ich bin (noch) kein Experte für C #.