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.

3voto

Var ist wie die gepunkteten Stellen in Kinderbüchern, die die Kinder ausfüllen müssen. Nur dass in diesem Fall der Compiler es mit dem richtigen Typ ausfüllt, der normalerweise nach dem =-Zeichen geschrieben wird.

2voto

Daniel Earwicker Punkte 111630

Erstaunlich, dass dies bisher noch nicht erwähnt wurde, aber es ist vernünftig, die var para foreach Schleifenvariablen.

Wenn Sie stattdessen einen bestimmten Typ angeben, riskieren Sie, dass der Compiler unbemerkt einen Laufzeit-Cast in Ihr Programm einfügt!

foreach (Derived d in listOfBase)
{

Der obige Text wird kompiliert. Aber der Compiler fügt einen Downcast von Base a Derived . Wenn also etwas auf der Liste nicht ein Derived zur Laufzeit gibt es eine ungültige Cast-Ausnahme. Die Typsicherheit ist beeinträchtigt. Unsichtbare Casts sind schrecklich.

Die einzige Möglichkeit, dies auszuschließen, ist die Verwendung von var so dass der Compiler den Typ der Schleifenvariablen anhand des statischen Typs der Liste bestimmt.

2voto

Euro Micelli Punkte 32040

Bei den Grenzfällen wird es sicher Meinungsverschiedenheiten geben, aber ich kann Ihnen meine persönlichen Leitlinien nennen.

Ich betrachte diese Kriterien, wenn ich mich für eine Verwendung entscheide var :

  • Der Typ der Variablen ist Offensichtlich [zu einem Menschen] aus dem Kontext
  • Der genaue Typ der Variablen ist nicht besonders relevant (zu einem Menschen)
    (z. B. können Sie herausfinden, was der Algorithmus tut, ohne sich darum zu kümmern, welche Art von Container Sie verwenden)
  • Der Typname ist sehr lang und stört die Lesbarkeit des Codes ( Hinweis: in der Regel eine Gattungsbezeichnung )

Umgekehrt würden mich diese Situationen dazu bringen, die var :

  • Der Typname ist relativ kurz und leicht zu lesen ( Hinweis: in der Regel keine Gattungsbezeichnung )
  • Der Typ ist nicht selbstverständlich aus dem Namen des Initialisierers
  • Der genaue Typ ist sehr wichtig, um den Code/Algorithmus zu verstehen
  • Bei Klassenhierarchien, wenn ein Mensch nicht leicht erkennen kann, welche Ebene der Hierarchie verwendet wird

Schließlich würde ich niemals var für native Werttypen oder entsprechende nullable<> Typen ( int , decimal , string , decimal? , ...). Es besteht die implizite Annahme, dass Sie bei der Verwendung von var muss es "einen Grund" geben.

Dies alles sind Leitlinien. Sie sollten auch die Erfahrung und die Fähigkeiten Ihrer Mitarbeiter, die Komplexität des Algorithmus, die Langlebigkeit und den Umfang der Variablen usw. berücksichtigen.

Meistens gibt es keine perfekte richtige Antwort. Oder sie ist nicht wirklich wichtig.

[Bearbeiten: doppelte Aufzählung entfernt]

2voto

Martin Harris Punkte 27587

Ich glaube, Sie Mai die Verwendung von var in C# missverstehen. Es ist immer noch starke Typisierung, im Gegensatz zu den VB-Variantentyp, so gibt es keine Leistung Hit von mit oder nicht.

Da es keine Auswirkungen auf den endgültigen kompilierten Code hat, ist es wirklich eine stilistische Entscheidung. Ich persönlich benutze es nicht, da ich den Code leichter zu lesen finde, wenn die vollständigen Typen definiert sind, aber ich kann mir vorstellen, dass in ein paar Jahren die vollständige Typendeklaration auf die gleiche Weise betrachtet wird wie jetzt die ungarische Notation - zusätzliche Typisierung für keinen wirklichen Vorteil gegenüber den Informationen, die uns Intellisense standardmäßig gibt.

2voto

chris Punkte 34644

Ich denke, dass Sie mit Ihrer Frage das Hauptproblem von var auf den Punkt bringen: "Ich muss den Typ nicht herausfinden". Wie andere schon gesagt haben, gibt es einen Platz für var, aber wenn man den Typ nicht kennt, mit dem man es zu tun hat, ist die Wahrscheinlichkeit ziemlich groß, dass man später Probleme bekommt - nicht in allen Fällen, aber der Geruch ist groß genug, dass man misstrauisch sein sollte.

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