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.

1voto

user418243 Punkte 1

Was von den meisten ignoriert wird:

var something = new StringBuilder(); 

wird normalerweise nicht so schnell getippt wie

StringBuilder something = KEY'TAB'();

1voto

Ira Baxter Punkte 91118

Sie können den Compiler (und denjenigen, der den Code als nächstes pflegt) den Typ von der rechten Seite der Initialisierungszuweisung ableiten lassen. Wenn diese Schlussfolgerung möglich ist, kann der Compiler sie durchführen, so dass Sie sich einige Tipparbeit ersparen.

Wenn die Schlussfolgerung für diesen armen Kerl einfach ist, dann haben Sie nichts verletzt. Wenn die Schlussfolgerung schwierig ist, haben Sie den Code schwieriger zu pflegen gemacht, und deshalb gilt als allgemeine Regel würde ich es nicht tun.

Und schließlich, wenn Sie beabsichtigen, dass der Typ etwas Bestimmtes sein soll, und Ihr Initialisierungsausdruck tatsächlich einen anderen Typ hat, bedeutet die Verwendung von var, dass es für Sie schwieriger ist, den verursachten Fehler zu finden. Wenn man dem Compiler explizit mitteilt, was der Typ sein soll, wenn der Typ nicht derselbe ist, erhält man sofort eine Diagnose. Wenn Sie die Typdeklaration weglassen und "var" verwenden, erhalten Sie keinen Fehler bei der Initialisierung; stattdessen erhalten Sie einen Typfehler in einem Ausdruck, der den vom var-Ausdruck zugewiesenen Bezeichner verwendet, und es wird schwieriger zu verstehen, warum.

Die Moral von der Geschicht' ist also, dass man mit var sparsam umgehen sollte; man tut damit weder sich selbst noch dem nachgeschalteten Betreuer einen Gefallen. Und hoffen Sie, dass er genauso denkt, damit Sie seine Absichten nicht erraten müssen, weil er dachte, die Verwendung von var sei einfach. Es ist ein Fehler, die Eingabe zu optimieren, wenn man ein System mit einer langen Lebensdauer programmiert.

1voto

aku Punkte 118808

@erlando, nur so aus Neugier, warum müssen Sie den Typ der Variablen kennen, wenn Sie sich den Quellcode ansehen?

In meiner Praxis habe ich festgestellt, dass der Variablentyp für mich nur zu dem Zeitpunkt wichtig ist, zu dem ich ihn im Code verwende.

Wenn ich versuche, eine unangemessene Operation an someVar Compiler gibt mir gerne einen Fehler \warning.

Es ist mir wirklich egal, welche Art von someVar hat, wenn ich das richtig verstehe warum es in dem gegebenen Kontext verwendet wird.

1voto

Giovanni Galbo Punkte 12811

Ich verwende var in den folgenden Situationen:

  1. Wenn ich es muss (Ergebnis ist anonym)
  2. Wenn der Typ in der gleichen Zeile wie der Code steht, z. B.

    var emp = new Employee();

Es ist offensichtlich, dass wir einen Mitarbeiter wollen (weil wir ein neues Mitarbeiterobjekt erstellen), also wie ist

Employee emp = new Employee() any more obvious?

Ich verwende var NICHT, wenn der Typ nicht abgeleitet werden kann, z. B.

var emp = GetEmployee();

Denn der Rückgabetyp ist nicht sofort ersichtlich (handelt es sich um einen Employee, einen IEmployee, etwas, das überhaupt nichts mit einem Employee-Objekt zu tun hat, usw.).

1voto

Kevin Berridge Punkte 6132

Ich muss zustimmen mit Matt Hamilton .

Var kann Ihren Code viel lesbarer und verständlicher machen, wenn er mit guten Variablennamen verwendet wird. Aber var kann auch dazu führen, dass Ihr Code genauso unmöglich zu lesen und zu verstehen ist wie Perl, wenn er schlecht verwendet wird.

Eine Liste mit guten und schlechten Verwendungen von var ist auch nicht sehr hilfreich. Dies ist ein Fall für den gesunden Menschenverstand. Die größere Frage ist die nach der Lesbarkeit oder der Schreibbarkeit. Vielen Entwicklern ist es egal, ob ihr Code lesbar ist. Sie wollen nur nicht so viel tippen. Ich persönlich bin eher ein Lese- als ein Schreibtyp.

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