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.

5voto

Richard Punkte 103159

Der Code, den ich gestern geschrieben habe, kann die Dinge sicherlich einfacher machen:

var content  = new Queue<Pair<Regex, Func<string, bool>>>();
...
foreach (var entry in content) { ... }

Dies wäre extrem langatmig gewesen ohne var .

Nachtrag: Ein wenig Zeit mit einer Sprache verbracht, die real Typinferenz (z.B. F#) wird zeigen, wie gut Compiler den Typ von Ausdrücken richtig einschätzen können. Das hat sicherlich dazu geführt, dass ich dazu neige, die var und die Verwendung eines expliziten Typs zeigt nun an, dass die Variable nicht vom Typ des initialisierenden Ausdrucks ist.

5voto

ShdNx Punkte 3114

In den meisten Fällen ist es einfach einfacher, sie zu tippen - stellen Sie sich vor

var sb = new StringBuilder();

anstelle von:

StringBuilder sb = new StringBuilder();

Manchmal ist es erforderlich, zum Beispiel: anonyme Typen, wie.

var stuff = new { Name = "Me", Age = 20 };

Ich persönlich verwende sie gerne, auch wenn sie den Code weniger lesbar und wartbar macht.

4voto

David Mårtensson Punkte 7402

Mit LINQ ein weiterer sehr guter Grund für die Verwendung von var ist, dass der Compiler die Abfrage viel stärker optimieren kann.

Wenn Sie eine statische Liste verwenden, um das Ergebnis zu speichern, wird es dort ausgeführt, wo Sie es der Liste zuweisen, aber mit var kann er die ursprüngliche Abfrage mit späteren Abfragen im Code zusammenführen, um optimierte Abfragen an die Datenbank zu erstellen.

Ich hatte ein Beispiel, bei dem ich einige Daten in einer ersten Abfrage abgerufen habe und dann eine Schleife durchführte und weitere Daten anforderte, um eine Tabelle auszudrucken.

LINQ führt diese so zusammen, dass die erste nur die ID zieht.

Dann fügte es in der Schleife eine zusätzliche Verknüpfung hinzu, die ich dort nicht durchgeführt hatte, um die Daten zu holen, die ich in das Original aufgenommen hatte.

Im Test erwies sich dies als wesentlich effizienter.

Hätten wir nicht die var es hatte die Abfragen genau so gemacht, wie wir sie geschrieben hatten.

3voto

David_001 Punkte 5433

Aus der Diskussion zu diesem Thema geht hervor, dass das Ergebnis so aussieht:

Gut: var customers = new List<Customer>();

Umstritten: var customers = dataAccess.GetCustomers();

Abgesehen von der fehlgeleiteten Meinung, dass "var" auf magische Weise beim Refactoring hilft, besteht das größte Problem für mich darin, dass die Leute darauf bestehen, dass es ihnen egal ist, was der Rückgabetyp ist, "solange sie die Sammlung aufzählen können".

Bedenken Sie:

IList<Customer> customers = dataAccess.GetCustomers();

var dummyCustomer = new Customer();
customers.Add(dummyCustomer);

Nun überlegen Sie:

var customers = dataAccess.GetCustomers();

var dummyCustomer = new Customer();
customers.Add(dummyCustomer);

Überarbeiten Sie nun die Datenzugriffsklasse, so dass GetCustomers Folgendes zurückgibt IEnumerable<Customer> und sehen, was passiert...

Das Problem hier ist, dass Sie im ersten Beispiel Ihre Erwartungen an die GetCustomers-Methode explizit machen - Sie sagen, dass Sie erwarten, dass sie etwas zurückgibt, das sich wie eine Liste verhält. Im zweiten Beispiel ist diese Erwartung implizit und nicht unmittelbar aus dem Code ersichtlich.

Es ist interessant (für mich), dass viele Pro-Var-Argumente sagen: "Es ist mir egal, welchen Typ es zurückgibt", aber weiter sagen: "Ich muss nur darüber iterieren...". (also muss es die IEnumerable-Schnittstelle implementieren, was den Typ fait Materie).

3voto

aku Punkte 118808

Ich hatte dieselben Bedenken, als ich mit der Nutzung von var Stichwort.
Ich habe mich jedoch mit der Zeit daran gewöhnt und werde nicht mehr zu expliziten Variablentypen zurückkehren. Der Compiler von Visual Studio \intellisense machen einen sehr guten Job, um die Arbeit mit implizit typisierten Variablen zu erleichtern.

Ich denke, dass die Einhaltung von Namenskonventionen zum besseren Verständnis von Code beitragen kann als die explizite Eingabe von Namen.

Es scheint die gleiche Art von Fragen zu sein wie "Soll ich Präfixe in Variablennamen verwenden?".
Bleiben Sie bei guten Variablennamen und lassen Sie den Compiler über die Variablentypen nachdenken.

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