C# Was ist besser var oder ClassName

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Ich habe eine Frage... bei C# kann man Var oder Klassennamen für Instanzierung benutzen. Ändert sich was an der Laufzeit wenn ich "var" anwende oder ist das dem Programm egal?

Bei einigen Klassen wäre schon eine Zeitersparnis ohne die ganzen Namespaces die Instanz zu erzeugen. Es geht mir hierbei um die Übersicht des Codes. Und wenn ich jetzt 100x Using schreibe und nur meine klassenspezifische Variablen/Methoden sehen will, dann hab ich dann ein Problem.
 
dem program ist es egal, nur lesbarer finde ich den klassennamen anstelle von var.

und das using muss doch auch nur einmal schreiben, oder verstehe ich dich ned?

Code:
using System..;
using kkkdk.dasdf.ne.meinnamespace;

lg

oli
 
Es wird mit Sicherheit nicht die Laufzeit deines Programms beeinträchtigen. Vermutlich ist die Verwendung von "var" anspruchsvoller, da der Compiler den Typ der Variablen mittels Inferenz zur Übersetzungszeit ermittelt! Ich bin jetzt nicht der c#-crack, aber meines Wissens nach verwendet man "var" dann, wenn man einen anonymen Typ erwartet!
 
Nein mit dem Using mach ich alle Klassen die in der NameSpace oder konkrete Klasse habe im AutoComplete Editor sichtbar.

Mir ist eigentlich wichtig die Übersicht in den kleinenren Klassen zu behalten damit man direkt weiss, ah diese Variable gehört zu meine Klasse. Daher habe ich bei den kleineren Klassen Meist keine Using.

Also ist es dem JIT egal ob es var oder KlassenName steht... dies hat keine Performancenachteile oder?
 
Das "var" Schlüsselwort ist ausschließlich Compile-Time. Der IL-Code sieht für beides gleich aus.
Heißt also, Performanceprobleme kriegst du da defintiv keine.

Ich hab das ganze mal für dich probiert und schau dir das Ergebnis selber an.
Folgender Code:

Code:
public class Test
    {
    }
    public class Program
    {
        static void Main()
        {


            var t = new Test();
            Test t2 = new Test();
                            
            
            Console.Read();
            
        }

Interessant sind die Stellen wo die beide Test-Objekte erstellt werden.
Der IL-Code dazu sieht wie folgt aus:

Code:
 [0] class Test.Test t,
            [1] class Test.Test t2)
        L_0000: nop 
        L_0001: newobj instance void Test.Test::.ctor()
        L_0006: stloc.0 
        L_0007: newobj instance void Test.Test::.ctor()
        L_000c: stloc.1
 
Das heißt dass der Compiler dann richtig die Vars übersetzt. Cool... danke
 
Aber an sich würde ich wenn möglich immer den Klassennamen nehmen...

Usings kann man sich von der IDE übrigens automatisch machen lassen, und normalerweise sollte sich der Bereich doch auch einfach zuklappen lassen...
 
Zuletzt bearbeitet:
Also mir ging oder gehts immer noch in der erste Linie um die Übersicht. Bei Using sehe ich den gesamten NameSpace, was ich in diesen Fall nicht sehen will. Ich weiss ich ob es stimmt, aber ist es nicht so, dass Using mehr Speicher schluckt wenn man nur 1x eine Klasse aus der NameSpace haben will? Dann hat man doch einen Overhead, oder?
 
Wieso sollte da mehr Overhead sein?

Using heißt ja nicht mehr als "Lieber Compiler, wenn du keine Ahnung hast, welche Klasse ich meine, schau einfach mal dort überall nach..."

Und ich finde vars tragen nicht wirklich zur Übersicht bei... (wobei es dank LINQ genug Situationen gibt, wo sie sinnvoll sind)
 
Zuletzt bearbeitet:
Ich bin kein Experte in Performance... hm naja man kann ja immer noch this.xyz angeben, um die ganzen usings auszublenden. Gut zu wissen...

Wenn ich nur 1x die Klasse anwenden will dann schreibe ich nie einen Using hin. Wenn es öfter vorkommen soll, dann schon. Gibt es eigentlich Tools die die Geschwindigkeit der Aufrufe messen können?
 
Nichttypisierte Variablen und Klassen sind seit der Spracherweiterung ".NET 3.5" mit an Board, siehe auch .NET_Framework_3.5. Ich finde allerdings auch, dass die Lesbarkeit dadurch nicht wirklich besser wird, im Gegenteil: der Compiler weiß (natürlich) was gemeint ist... aber ob das der Mensch (also DU ;) ) in 2 Jahren noch weiß, wenn er den Code nochmal öffnen muss wage ich zu bezweifeln.

Es gibt sicherlich Anwendungsfälle, in denen es sich lohnt Dinge abzukürzen, aber ich denke - gerade dank IntelliSense - ist das "Tippen" im VS ja nicht wirklich anstrengend :) Daher => Ausschreiben.

Zum Thema Using: C# ist eine Compilersprache mit eigenem Framework, welche während des Compilierens in eine "Zwischensprache" (Intermediate Language) übersetzt. Alles, aber wirklich alles, was du an geschriebenen Sachen siehst wird also zunächst eh übersetzt. Alles, was du siehst, dient DIR zur Übersicht. Und daher würde ich immer einheitlich bleiben, in deinem Fall also die Using-Direktiven am Codeanfang aufführen und gut ist's. Ob da eine oder 1000 stehen spielt per se keine Rolle. In der Entwicklungsumgebung vielleicht noch, aber spätestens ab der IL steht da idR sowieso nichts mehr von dem was du geschrieben hast :)

Frage dich immer, ob du den Code so, wie er jetzt da steht, in einem oder zwei Jahren noch ohne Probleme und lange Einarbeitung lesen könntest. Wenn nicht => Setzen, nacharbeiten :)

VG,
Mad
 
Zurück
Oben