Tja, ich denke eines der meist umstrittensten Neuerungen von C# 3.0 ist das kleine Wörtchen var. Schon im Vorfeld der Veröffentlichung von C# 3.0 waren im Internet heisse Diskussionen zu lesen. Jetzt, wo viele Entwickler .NET 3.5 und C# 3.0 im Einsatz haben, ist der Diskussionsbedarf auch nicht besonders gemindert.

Anfangs war ich vom Einsatz und den Möglichkeiten, die durch var entstehen sehr angetan. Ehrlich gesagt bin ich das heute noch. Aber mein Enthusiasmus ist doch deutlich gedämpft, jetzt wo ich es im Einsatz sehe und selbst einsetze. Mein “Problem” (wenn man das so überhaupt sagen kann) mit var ist nicht die Typ-Inferenz die es ermöglicht, sondern eher der zuweilen exzessive Einsatz.

Besonders betrübt bin ich, wenn ich z.B. in populären Blogs wie dem von Jeff Adwood lesen muss, dass var das Allheilmittel schlechthin ist und so oft wie nur irgendmöglich eingesetzt werden sollte. Bei solchen Aussagen liegt bei mir die Vermutung nahe, das Jeff gerade nicht sehr große Projekte in C# stemmt. Schließlich wurde var nicht erfunden um die Deklarations- bzw. Konstruktionssyntax in C# zu verschönern, sondern dient einem dedizierten Zweck.

Umso erfreulicher ist es, das ich mich mit meiner Meinung in bester Gesellschaft vorfinde. So erklärt z.B. Richard sehr gut, das es beim var Keyword nicht um die Verkürzung von Codezeilen geht sondern bei exzessivem Einsatz eher in die Kategorie Programmierfaulheit einzustufen ist. Ich persönlich befürworte vollständig seine Meinung, wonach var dort eingesetzt werden sollte, wo es benötigt wird, und nicht überall wo es möglich ist.

Setzt man var überall ein, wo es möglich wäre, kommt solcher Code zustande:

public object GetMatchingCode(object[] codes, string matchPattern, bool ignoreInvalid)
{
  var bestMatch = FindBestMatch(matchPattern);
  var blackList = codelists.GetBlackList(codes);

  foreach(var c = in blackList.GetConfirmedCodes())
  {
    var matchPoint = bestMatch.CompareCode(c, ignoreInvalid);
    matchPoint.Combine(c.ParentCode);
    if (matchPoint.IsUnique(bestMatch)) return matchPoint;
  }

  return null;
}

Du als Leser dieser Codezeilen hast kein Visual Studio und keine Intellisense. Weißt Du, worum es bei diesen Codezeilen eigentlich geht? Ich wüßte es jedenfalls nicht.

Zugegeben, das Beispiel mag überspitzt sein. Jedoch übertreibe ich nicht, wenn ich sage, das ich “echten” Code schon lesen (und verstehen) musste, der mindestens den gleichen Grad von “konsequentem var Einsatz” aufwies wie obiges Beispiel.

Auf der anderen Seite ist var natürlich auch notwendig und äußerst sinnvoll. Die Paradedisziplin dabei ist sicherlich der Einsatz anonymer Typen mit LINQ:
var persons =
  from customer in db.Customers
  where customer.State = 1
  select new { Id = customer.Id, Name = customer.Name };

Ich für meinen Teil finde var und Typ-Inferenz eine gelungene, sogar notwendige Bereicherung in C# - aber nur dort, wo es wirklich gebraucht wird. Obwohl Soren in seinem Blog mit “the C# keyword var is evil” sicherlich übertreibt, ist es dennoch empfehlenswert seinem Beispiel zu folgen und die geradezu unsinnige “Benutze immer var”-Funktion im ReSharper einfach abzuschalten.

Mein Fazit: var ist nur dann cool, wenn ich es wirklich brauche - ansonsten bleibe ich bei expliziter Typdeklaration und lasse mir auch gerne vom mächtigen Visual Studio Intellisense/Autocomplete helfen.

Comments
This article has 2 comments:

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

  • Aus meiner Sicht...
    by Mike Bild
    on December 4th 2010

    Aus meiner Sicht liegt die schlechte Lesbarkeit in der Verwendung von object und object[] nicht im “var”. Was würde kein “var” hier verbessern? Ich meine nichts, außer den Typennamen zu kennen. Aber ohne Typenbeschreibung bring mir der Typenname auch nichts. Ich finde das Beispiel OK, wenn es keine objects wären, wenn ein IEnumerable als Parameter verwendet würde und wenn ein IEnumerable return werden würde. Null return würde ich in diesem Beispiel auch nicht machen, da es sich aus meiner sicht um eine Methode zur Weiterverarbeitung handelt.

    Naja also an der Methode stimmt einiges nicht, der kleinste Grund, so meine ich, ist “var”.

    Beste Grüße, Mike

  • Wenn das nicht...
    by Rainer Hilmer
    on December 4th 2010

    Wenn das nicht überzeugt, weiß ich auch nicht mehr weiter (Bezug: Twitter-Diskussion im Dezember 2010). :-)
    Gruß
    Rainer


(c) 2000-2012 ilker.de - Creative Computing.

For any case of inquiry regarding this document, you can always contact the website owner.