Variablendatentypen explizit definieren oder das Schlüsselwort 'var' verwenden? [geschlossen]

35

Bin ich in C # aufgefordert, das universelle var-Schlüsselwort für jede Variablendeklaration zu verwenden? Wenn ja, muss ich diese Sonderzeichen für Literalwerte in der Variablendeklaration wie das M für Dezimal in der folgenden Anweisung angeben:

var myDecimal = 14.5M;

Wenn es einen Unterschied macht, versuche ich, eine Webentwicklung mit C # durchzuführen.

Wassimanen
quelle
7
Hat ein Dutzend Dupes bei SO (wo es meiner Meinung nach hingehört).
1
Die gleichen Fragen kommen zu C ++, wenn C ++ 0x neu verwendet wird auto.
David Thornley
5
Eric Lippert vom C # -Compiler-Team hat kürzlich darüber gebloggt
Tim Goodman
Es gibt sechs Milliarden Betrüger dieser Frage.
DeadMG
@DeadMG das sind sechs Milliarden und eins.
Wassimans

Antworten:

53

Über die Verwendung von var wurde viel gestritten. Meine allgemeinen Regeln sind die folgenden.

  • Wenn der Typ offensichtlich ist, z. B. wenn die rechte Hand der Zuweisung ein Konstruktor ist, verwenden Sie var.
  • Wenn der Typ komplex zu schreiben ist, wie z. B. eine LINQ-Abfrage (der Grund für var an erster Stelle), verwenden Sie var.
  • Schreiben Sie ambivalente Typen (Ihre Dezimalzahl ist ein Beispiel), bei denen Sie sicherstellen möchten, dass Ihre Variable korrekt eingegeben wurde.
  • Anonyme Typen müssen var verwenden.
  • In allen anderen Fällen buchstabieren Sie den Typ.

Grundsätzlich besteht das Ziel darin, das Lesen des Codes zu erleichtern. Wenn Sie der Meinung sind, dass var ausreicht, weil die Zuordnung offensichtlich ist, verwenden Sie var. Verwenden Sie den vollständigen Typnamen als Hinweis für den Leser, wenn Sie dies für erforderlich halten.

Michael Brown
quelle
9
Ich verwende 'var' auch in foreachAnweisungen, bei denen es mir nur darum geht, eine Sammlung aufzuzählen, nicht unbedingt um den Typ jedes Elements.
Adam Lear
1
Und wie Jesse auf anonyme Typen hinwies;)
Michael Brown
4
@AnnaLear manchmal muss man sich aber kümmern. foreach (var row in datatable.Rows) In diesem Fall ist var ein Objekt, nicht wie erwartet eine DataRow.
Thanos Papathanasiou
@ ThanosPapathanasiou Sicher, ja. Gleiches gilt für die Controls-Auflistung in Windows Forms und wahrscheinlich auch für andere Situationen.
Adam Lear
Normalerweise benutze ich var, es sei denn, ich möchte sicher sein, dass der Typ meiner Variablen
stimmt
14

Wann zu verwenden varist eine Programmierung "Holy War". Es gibt genau einen Ort, an dem dies erforderlich ist: Wenn das Ergebnis einer Operation einen anonymen Typ erstellt, wie z.

var result = new { Name = "John", Age = 35 };

An jedem anderen Ort ist es optional und Ihrem Kodierungsstandard entsprechend, es in den anderen Situationen zu verwenden oder nicht.

Und ja, Sie benötigen die Sonderzeichen für Literale, um den Compiler wissen zu lassen, was auf der rechten Seite steht. In Ihrem Beispiel ohne Mist der Standardwert doubleeher als decimal.

Jesse C. Slicer
quelle
1
Ich habe alles über anonyme Typen vergessen!
Michael Brown
Bei meinem letzten Job wurde mir gesagt, dass ich entlassen werde, wenn ich weiterhin das Schlüsselwort "var" verwende ...
hanzolo
Das ist extrem, aber die Initiative Ihres Unternehmens. Ich bin froh, dass es dein "letzter" Job ist! :)
Jesse C. Slicer
7

Von MSDN :

Die Verwendung von var kann jedoch dazu führen, dass Ihr Code für andere Entwickler schwieriger zu verstehen ist. Aus diesem Grund wird in der C # -Dokumentation var im Allgemeinen nur verwendet, wenn dies erforderlich ist.

Ich mag implizites Tippen wirklich, wirklich nicht. Oberflächlich betrachtet macht es den Code besser lesbar, kann aber später zu vielen Problemen führen. Wenn ein Entwickler einen Variableninitialisierer ändert, sagen wir von

var myFloat=100f;

zu

var myFloat=100;

oder

var myFloat=100.0;

Der Typ ändert sich und führt zu einer ganzen Reihe von Compilerfehlern oder, wenn es sich um eine Webansicht handelt und Sie den Postbuild-Schritt nicht zum Vorkompilieren Ihrer Ansichten verwenden, zu einer ganzen Reihe von Laufzeitfehlern, die nicht ohne Wirkung abgefangen werden Pre-Deployment-Tests.

Implizite Eingabe funktioniert auch nicht überall (über denselben MSDN-Link)

var kann nur verwendet werden, wenn eine lokale Variable in derselben Anweisung deklariert und initialisiert wird. Die Variable kann nicht mit null, einer Methodengruppe oder einer anonymen Funktion initialisiert werden.

var kann nicht für Felder im Klassenbereich verwendet werden.

Mit var deklarierte Variablen können nicht im Initialisierungsausdruck verwendet werden. Mit anderen Worten, dieser Ausdruck ist legal: int i = (i = 20); Dieser Ausdruck erzeugt jedoch einen Fehler beim Kompilieren: var i = (i = 20);

Mehrere implizit typisierte Variablen können nicht in derselben Anweisung initialisiert werden.

Befindet sich ein Typ namens var im Gültigkeitsbereich, wird das Schlüsselwort var in diesen Typnamen aufgelöst und nicht als Teil einer implizit typisierten lokalen Variablendeklaration behandelt.

Es ist sehr, sehr gut, den Code konsistent zu halten (in diesem Fall überall explizite Eingabe). Meiner Meinung nach varist faul und bietet keinen wirklichen Nutzen und führt noch einen weiteren potenziellen Fehlerpunkt in einem bereits komplexen Prozess ein.

Update 2017

Ich habe meine Meinung komplett geändert. Wenn ich in C # arbeite, verwende ich die varmeiste Zeit (mit Ausnahme von Variablen vom Typ Interface und dergleichen). Es hält den Code knapp, was die Lesbarkeit verbessert. Dennoch - achten Sie darauf, was der aufgelöste Typ wirklich ist.

3Dave
quelle
Fragen Sie sich, was Ihre Meinung geändert hat, @ 3Dave. Ich stimme immer noch zu 100% mit Ihrem ursprünglichen Punkt überein: "var ist faul und bietet keinen wirklichen Nutzen und führt einen weiteren potenziellen Fehlerpunkt in einem bereits komplexen Prozess ein."
Dan
@Dan Es kam wirklich auf die Lesbarkeit an. Ein kompetenter Entwickler kann ohne Probleme schnell feststellen, was sich auf der Initialisierungsseite einer Deklaration befindet. Genau wie this.wenn man nicht überall verwendet oder System.Blah.SomeTypeanstelle von a sagt using, was ich immer noch unglaublich ärgerlich finde, ist knapperer Code - zumindest für mich - in der Regel einfacher visuell zu analysieren. Es gibt immer noch viele Szenarien, in denen explizite Eingabe die richtige Wahl ist. Aber heutzutage bin ich weniger ein Sprachanwalt als jemand, der nur versucht, sauberen Code aus der Tür zu bekommen.
3Dave
@ Dan (Natürlich bin ich auch der Typ, der using namespace std;in CPP-Dateien verwendet. (Keine Header, da ich es vorziehen würde, nicht geteert und gefiedert zu werden.)
3Dave
3

Die C # -Referenz zeigt Folgendes, um die gute oder schlechte Verwendung dieses Konstrukts zu veranschaulichen:

Das folgende Beispiel zeigt zwei Abfrageausdrücke. Im ersten Ausdruck ist die Verwendung von var zulässig, jedoch nicht erforderlich, da der Typ des Abfrageergebnisses explizit als IEnumerable angegeben werden kann. Im zweiten Ausdruck muss jedoch var verwendet werden, da das Ergebnis eine Auflistung anonymer Typen ist und der Name dieses Typs nur für den Compiler selbst zugänglich ist. Beachten Sie, dass in Beispiel 2 das Element der foreach-Iterationsvariablen ebenfalls implizit eingegeben werden muss.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }
Thulani Chivandikwa
quelle
0

Das Schlüsselwort var fordert den Compiler nur auf, den Typ der Variablen var type automatisch abzuleiten. Wenn Sie also eine Variable vom Typ Dezimal in einer Variablen var speichern möchten, müssen Sie das m verwenden. Wenn Sie eine Zeichenfolge speichern, müssen Sie diese ebenfalls in Anführungszeichen setzen.

Computerprogrammierer
quelle
0

Für mich benutze ich var nicht für die folgenden Fälle:

  • Wenn ich mir des Typs meiner Variablen sicher sein möchte (zum Beispiel, um sicherzugehen, dass der verwendete Typ doppelt und nicht dezimal ist, und das ist eine große Sache, vertrau mir!)
  • Polymorpher Code wie Fruit foo = new Apple();. In diesem Fall ist var meiner Meinung nach zu vermeiden, und die Verwendung der Elternklasse (hier Fruit) ist besser, indem ein besseres Verständnis der Codelogik und der Begrenzung der wahrscheinlichen Fehler ermöglicht wird (bei var keine Überprüfung des polymorphen Konzepts!).

Im Übrigen denke ich, dass es vom Fall und vom Hintergrund des Entwicklers abhängt. Einige Leute aus der PHP-Welt werden es vorziehen, sich nicht um die Variablentypen zu kümmern, und einige Leute aus der Java-Welt werden einfach denken, dass var eine Häresie ist und je ausführlicher es ist, desto besser ist es.

Sie müssen Ihre persönliche Meinung abgeben :)

eka808
quelle