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

Randolpho Punkte 54011

var ist nicht schlecht. Denken Sie daran. var ist nicht schlecht. Wiederholen Sie es. var ist nicht schlecht. Denken Sie daran. var ist nicht schlecht. Wiederholen Sie es.

Wenn der Compiler klug genug ist, um den Typ aus dem Kontext herauszufinden, dann sind Sie es auch. Sie müssen ihn nicht direkt bei der Deklaration aufschreiben. Und Intellisense macht das sogar noch weniger notwendig.

var ist nicht schlecht. Denken Sie daran. var ist nicht schlecht. Wiederholen Sie es. var ist nicht schlecht. Denken Sie daran. var ist nicht schlecht. Wiederholen Sie es.

1voto

Jon Limjap Punkte 92084

In unserem Büro hat unser CTO die Verwendung des Schlüsselworts var kategorisch verboten, und zwar aus denselben Gründen, die Sie genannt haben.

Ich persönlich finde die Verwendung von var nur in neuen Objektdeklarationen gültig, da der Typ des Objekts in der Anweisung selbst offensichtlich ist.

Bei LINQ-Abfragen können Sie die Ergebnisse auflösen:

IEnumerable<TypeReturnedBySelectObject>

1voto

Jeff Sternal Punkte 46528

Gestrichen aus Gründen der Redundanz.

vars werden immer noch als der richtige Variablentyp initialisiert - der Compiler leitet ihn einfach aus dem Kontext ab. Wie Sie angedeutet haben, ermöglicht var die Speicherung von Referenzen auf anonyme Klasseninstanzen - aber es macht es auch einfacher, Ihren Code zu ändern. Zum Beispiel:

// If you change ItemLibrary to use int, you need to update this call
byte totalItemCount = ItemLibrary.GetItemCount();

// If GetItemCount changes, I don't have to update this statement.
var totalItemCount = ItemLibrary.GetItemCount();

Ja, wenn es schwierig ist, den Typ einer Variablen anhand ihres Namens und ihrer Verwendung zu bestimmen, sollte ihr Typ auf jeden Fall explizit angegeben werden.

1voto

Julie in Austin Punkte 927

Wenn Sie den Typ kennen, verwenden Sie den Typ. Wenn Sie den Typ nicht kennen, warum nicht? Wenn Sie den Typ nicht kennen können, ist das in Ordnung - Sie haben die einzig gültige Verwendung gefunden.

Und es tut mir leid, aber wenn das Beste, was Sie tun können, ist "es macht den Code alle Zeile", das ist nicht eine gute Antwort. Finden Sie einen anderen Weg, Ihren Code zu formatieren.

1voto

Igor Brejc Punkte 18057

Ein gutes Argument, warum vars nicht als bloße "Abkürzung" verwendet werden sollten, sondern für die Szenarien, für die sie ursprünglich gedacht waren: Resharper (zumindest v4.5) kann keine Verwendungen eines Typs finden, wenn dieser als var dargestellt wird, was beim Refactoring oder der Analyse des Quellcodes ein echtes Problem darstellen kann.

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