Verwendung von using innerhalb oder außerhalb des Namespace? Auswirkungen auf die Leistung von C#

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Krieg der Welten: using innerhalb oder außerhalb des Namespace in C#

\n\n

Wenn Sie jemals in C# programmiert haben, haben Sie diese Debatte sicherlich in Kommentaren oder auf Stack Overflow gesehen. Manche Entwickler schreiben using hartnäckig innerhalb des namespace, andere außerhalb. Und jeder ist überzeugt, dass sein Ansatz der einzig richtige ist. Aber wer hat recht? Und vor allem: Beeinflusst dies die Leistung Ihres Codes?

\n\n

Lassen Sie uns diese Frage ein für alle Mal klären, unter die Haube des Compilers schauen und herausfinden, was tatsächlich mit Ihren using-Direktiven passiert. Spoiler: Die Antwort wird Sie überraschen.

\n\n

Was sind using-Direktiven überhaupt und wozu dienen sie?

\n\n

Bevor wir in die Tiefe gehen, erinnern wir uns an die Grundlagen. using-Direktiven sind Ihr Pass in die Welt fremder Namespaces. Ohne sie müssten Sie jedes Mal vollständig qualifizierte Namen schreiben:

\n\n
System.Console.WriteLine("Hallo, Welt!");\nSystem.Collections.Generic.List<int> numbers = new System.Collections.Generic.List<int>();
\n\n

Geben Sie zu, das sieht schrecklich aus. using-Direktiven machen den Code sauberer und lesbarer:

\n\n
using System;\nusing System.Collections.Generic;\n\nConsole.WriteLine("Hallo, Welt!");\nList<int> numbers = new List<int>();
\n\n

Aber wo man sie platziert – das ist eine Frage, die Generationen von C#-Entwicklern quält.

\n\n

Zwei Lager: außerhalb vs. innerhalb

\n\n

So sehen die beiden Ansätze aus:

\n\n

Variante 1: using außerhalb des Namespace

\n\n
using System;\nusing System.Collections.Generic;\n\nnamespace MyApp\n{\n    class Program\n    {\n        static void Main()\n        {\n            List<int> list = new List<int>();\n        }\n    }\n}
\n\n

Variante 2: using innerhalb des Namespace

\n\n
namespace MyApp\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            List<int> list = new List<int>();\n        }\n    }\n}
\n\n

Auf den ersten Blick besteht der Unterschied nur in den Einrückungen. Aber die Community hat sich in zwei unversöhnliche Lager gespalten. Lassen Sie uns die Argumente beider Seiten analysieren.

\n\n

Argument Nr. 1: Leistung und Kompilierung

\n\n

Die häufigste Frage: Beeinflusst die Platzierung von using die Leistung? Kurze Antwort: NEIN. Und hier ist der Grund.

\n\n

using-Direktiven sind reiner syntaktischer Zucker für den Compiler. Sie existieren nur während der Kompilierung. Wenn Ihr Code in IL (Intermediate Language) umgewandelt wird, bleibt von den using-Direktiven keine Spur. Der Compiler verwendet sie lediglich, um Typnamen aufzulösen, und verwirft sie dann.

\n\n

Lassen Sie uns dies praktisch beweisen. Betrachten Sie diesen Code:

\n\n
// Datei: Program.cs\nusing System;\nusing System.Collections.Generic;\n\nnamespace MyApp\n{\n    class Program\n    {\n        static void Main()\n        {\n            List<int> list = new List<int>();\n            Console.WriteLine(list.Count);\n        }\n    }\n}
\n\n

Nach der Kompilierung in IL-Code sehen Sie in etwa Folgendes (stark vereinfacht):

\n\n
.method private hidebysig static void Main() cil managed\n{\n    .entrypoint\n    .maxstack 1\n    .locals init (\n        [0] class [System.Runtime]System.Collections.Generic.List`1<int32> list\n    )\n    \n    // Erstellen von List<int>\n    newobj instance void class [System.Runtime]System.Collections.Generic.List`1<int32>::.ctor()\n    stloc.0\n    \n    // Aufruf von Console.WriteLine\n    ldloc.0\n    callvirt instance int32 class [System.Runtime]System.Collections.Generic.List`1<int32>::get_Count()\n    call void [System.Console]System.Console::WriteLine(int32)\n    \n    ret\n}
\n\n

Beachten Sie: Im IL-Code werden vollständig qualifizierte Namen verwendet (System.Collections.Generic.List`1,

Blogs

Buchempfehlungen