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 istvar 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.
byMike BildonDecember 4th 2010Aus 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
byRainer HilmeronDecember 4th 2010Wenn das nicht überzeugt, weiß ich auch nicht mehr weiter (Bezug: Twitter-Diskussion im Dezember 2010).
Gruß
Rainer