405 Stimmen

Verwendung des Schlüsselworts var in C#

Nach einer Diskussion mit Kollegen über die Verwendung des Schlüsselworts "var" in C# 3 habe ich mich gefragt, welche Meinung die Leute zur angemessenen Verwendung der Typinferenz über var haben?

Zum Beispiel habe ich var in fragwürdigen Situationen ziemlich faul verwendet, z.B.:-

foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

Weitere legitime Verwendungszwecke von var sind folgende:-

var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

Interessanterweise scheint LINQ eine Art Grauzone zu sein, z.B.:-

var results = from r in dataContext.SomeTable
              select r; // Not *entirely clear* what results will be here.

Es ist klar, was daraus resultiert, dass es sich um einen Typ handelt, der IEnumerable implementiert, aber es ist nicht ganz so offensichtlich wie bei einer var, die ein neues Objekt deklariert.

Noch schlimmer ist es, wenn es um LINQ to objects geht, z.B.:-

var results = from item in someList
              where item != 3
              select item;

Dies ist nicht besser als das Äquivilent foreach(var item in someList) { // ... } gleichwertig.

Es gibt hier ein echtes Problem mit der Typsicherheit - wenn wir zum Beispiel die Ergebnisse dieser Abfrage in eine überladene Methode stellen würden, die IEnumerable<int> und IEnumerable<double> akzeptiert, könnte der Aufrufer versehentlich den falschen Typ übergeben.

var fait eine starke Typisierung beibehalten, aber die Frage ist, ob es gefährlich ist, wenn der Typ bei der Definition nicht sofort ersichtlich ist, was noch verstärkt wird, wenn Überladungen bedeuten, dass Compilerfehler nicht ausgegeben werden, wenn Sie einer Methode versehentlich den falschen Typ übergeben.

17voto

Jon Limjap Punkte 92084

Ein spezieller Fall, in dem var schwierig ist: Offline-Code-Reviews, insbesondere solche auf Papier.

Sie können sich dabei nicht auf Mouse-overs verlassen.

17voto

Guffa Punkte 663241

Wenn jemand die var Schlüsselwort, weil sie nicht "den Typ herausfinden" wollen, das ist definitiv der falsche Grund. Die var Schlüsselwort keine Variable mit einem dynamischen Typ erzeugt, muss der Compiler dennoch den Typ kennen. Da die Variable immer einen bestimmten Typ hat, sollte der Typ nach Möglichkeit auch im Code ersichtlich sein.

Gute Gründe für die Verwendung der var Stichwort sind zum Beispiel:

  • Wo dies erforderlich ist, z. B. um einen Verweis für einen anonymen Typ zu deklarieren.
  • Wenn der Code dadurch lesbarer wird, d. h. wenn sich wiederholende Deklarationen entfernt werden.

Wenn Sie den Datentyp ausschreiben, ist der Code oft leichter zu verstehen. Es zeigt, welche Datentypen Sie verwenden, so dass Sie den Datentyp nicht erst herausfinden müssen, indem Sie herausfinden, was der Code tut.

17voto

Frep D-Oronge Punkte 2570

Ich verstehe nicht, was daran so schlimm sein soll.

var something = someMethod(); // Type of 'something' not clear <-- not to the compiler!

Sie haben immer noch volle Intellisense auf "etwas", und für jeden mehrdeutigen Fall haben Sie Ihre Unit-Tests, richtig? (Haben Sie?)

Es handelt sich nicht um varchar, nicht um dim und schon gar nicht um dynamische oder schwache Typisierung. Es stoppt die Verrücktheit auf diese Weise:

List<somethinglongtypename> v = new List<somethinglongtypename>();

und das gesamte Gedankenwirrwarr zu reduzieren:

var v = new List<somethinglongtypename>();

Nett, nicht ganz so nett wie:

v = List<somethinglongtypename>();

Aber das ist es, was Buh ist für.

11voto

Colin Desmond Punkte 4731

Wenn man bedenkt, wie leistungsfähig Intellisense heute ist, bin ich mir nicht sicher, ob var schwieriger zu lesen ist als Mitgliedsvariablen in einer Klasse oder lokale Variablen in einer Methode, die außerhalb des sichtbaren Bildschirmbereichs definiert sind.

Wenn Sie eine Codezeile haben wie

IDictionary<BigClassName, SomeOtherBigClassName> nameDictionary = new Dictionary<BigClassName, SomeOtherBigClassName>();

Ist viel einfacher oder schwieriger zu lesen als:

var nameDictionary = new Dictionary<BigClassName, SomeOtherBigClassName>();

10voto

Blorgbeard Punkte 96796

Ja, sicher, int ist einfach, aber wenn der Typ der Variablen IEnumerable<MyStupidLongNamedGenericClass<int, string>> var macht alles viel einfacher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X