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.

10voto

Murph Punkte 9805

Ich denke, das Wichtigste bei VAR ist, dass man es nur dort verwendet, wo es angebracht ist, d.h. wenn man Dinge in Linq tut, die es erleichtert (und wahrscheinlich auch in anderen Fällen).

Wenn Sie hat einen Typ für etwas in der dann sollten Sie es verwenden - dies nicht zu tun ist einfach Faulheit (im Gegensatz zu kreativer Faulheit, die im Allgemeinen zu fördern ist - gute Programmierer arbeiten oft sehr hart, um faul zu sein und könnte als die Quelle der Sache in erster Linie).

Ein pauschales Verbot ist genauso schlimm wie der Missbrauch des Konstrukts selbst, aber es muss einen vernünftigen Kodierungsstandard geben.

Die andere Sache zu erinnern ist, dass es nicht ein VB-Typ var in, dass es nicht Typen ändern kann - es ist eine stark typisierte Variable ist es nur, dass der Typ abgeleitet wird (weshalb es Leute gibt, die argumentieren, dass es nicht unvernünftig ist, es in, sagen wir, einer foreach zu verwenden, aber ich würde aus Gründen der Lesbarkeit und Wartbarkeit nicht zustimmen).

Ich habe den Verdacht, dass dieser Fall immer wieder auftauchen wird (-:

Murph

9voto

Rostov Punkte 2378

Gestohlen aus dem Beitrag zu diesem Thema bei CodingHorror :


Leider haben Sie und alle anderen sich ziemlich geirrt. Ich stimme Ihnen zwar zu, dass Redundanz keine gute Sache ist, aber die bessere Lösung für dieses Problem wäre gewesen, etwas wie das Folgende zu tun:

_

MyObject m = new();

Oder wenn Sie Parameter übergeben:

Person p = new("FirstName", "LastName);

Bei der Erstellung eines neuen Objekts leitet der Compiler den Typ von der linken und nicht von der rechten Seite ab. Dies hat weitere Vorteile gegenüber "var", da es auch in Felddeklarationen verwendet werden kann (es gibt auch einige andere Bereiche, in denen es nützlich sein könnte, aber ich werde hier nicht näher darauf eingehen).

Letztendlich war es nicht beabsichtigt, die Redundanz zu verringern. Verstehen Sie mich nicht falsch, "var" ist SEHR wichtig in C# für anonyme Typen/Projektionen, aber die Verwendung hier ist einfach WEG von (und ich sage das schon seit langer, langer Zeit), da Sie den Typ, der verwendet wird, verschleiern. Dass man ihn zweimal eingeben muss, ist zu oft, aber ihn nullmal zu deklarieren ist zu wenig.

_

Nicholas Paldino .NET/C# MVP am Juni 20, 2008 08:00 AM


Ich denke, wenn Ihr Hauptanliegen darin besteht, weniger tippen zu müssen, dann gibt es kein Argument, das Sie von der Nutzung abbringen könnte.

Wenn Sie nur zu immer die Person sein, die sich Ihren Code ansieht, wen kümmert es dann? Ansonsten, in einem Fall wie diesem:

var people = Managers.People

das ist in Ordnung, aber in einem Fall wie diesem:

var fc = Factory.Run();

Es schließt alle unmittelbaren Schlussfolgerungen aus, die mein Gehirn aus dem "Englisch" des Codes ziehen könnte.

Andernfalls sollten Sie nach bestem Wissen und Gewissen vorgehen und die Höflichkeit gegenüber anderen, die an Ihrem Projekt arbeiten müssen, programmieren.

9voto

MartinStettner Punkte 27921

Verwendung von var anstelle des expliziten Typs macht Refactorings viel einfacher (daher muss ich den Vorpostern widersprechen, die meinten, es mache keinen Unterschied oder sei nur "syntaktischer Zucker").

Sie können den Rückgabetyp Ihrer Methoden ändern, ohne jede Datei zu ändern, in der diese Methode aufgerufen wird. Stellen Sie sich vor:

...
List<MyClass> SomeMethod() { ... }
...

die verwendet wird wie

...
IList<MyClass> list = obj.SomeMethod();
foreach (MyClass c in list)
  System.Console.WriteLine(c.ToString());
...

Wenn Sie ein Refactoring durchführen wollten SomeMethod() zur Rückgabe einer IEnumerable<MySecondClass> müssen Sie die Variablendeklaration ändern (auch innerhalb der foreach ) an jeder Stelle, an der Sie die Methode verwendet haben.

Wenn Sie schreiben

...
var list = obj.SomeMethod();
foreach (var element in list)
  System.Console.WriteLine(element.ToString());
...

stattdessen müssen Sie sie nicht ändern.

8voto

erlando Punkte 6638

@aku: Ein Beispiel sind Code-Reviews. Ein anderes Beispiel sind Refactoring-Szenarien.

Im Grunde genommen möchte ich nicht mit meiner Maus auf Tippjagd gehen. Vielleicht ist sie nicht verfügbar.

8voto

Daren Thomas Punkte 64742

Das ist eine Frage des Geschmacks. Dieses ganze Getue um die Typ einer Variablen verschwindet, wenn man sich an dynamisch typisierte Sprachen gewöhnt. Das heißt, si Wenn Sie sie jemals mögen (ich weiß nicht, ob das jeder kann, aber ich kann es).

C#s var ist ziemlich cool, weil es siehe wie die dynamische Typisierung, ist aber eigentlich statisch Typisierung - der Compiler erzwingt die korrekte Verwendung.

Der Typ Ihrer Variablen ist nicht wirklich wichtig (das wurde schon einmal gesagt). Er sollte aus dem Kontext (Interaktionen mit anderen Variablen und Methoden) und dem Namen relativ klar sein - erwarten Sie nicht KundenListe enthalten eine int ...

Ich warte immer noch darauf, zu sehen, was mein Chef über diese Angelegenheit denkt - ich habe ein pauschales "go ahead" bekommen, um alle neuen Konstrukte in 3.5 zu verwenden, aber was werden wir mit der Wartung machen?

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