|
News:
|
var map = new Dictionary<Guid, Tuple<Guid, List<string>>();
foreach(var item in list)
var item = GetItemFromSomewhere();
// ...
item.DoSomething();
item.DoSomething();und nicht bei der Zuweisung
var item = GetItemFromSomewhere();Der Zuweisungsfehler wird also verschleppt. Davor mag man auch in den von mir genannten Fällen nicht immer sicher sein, aber es ist eben unser Konsens aus Verständlichkeit und Effizienzgewinn.
|
|
|
Da sagst du was. Wie viele Stunden ich schon mit meinen Programmierern hier gesessen und über Pro und Contra philosophiert habe. Ergebniss lässt sich annähernd mit deinem vergleichen. Solange es klar ersichtlich ist, kein Problem. Sobald es unklar werden könnte wird explizit typisiert (auch wegen der von dir genannten Verschleppung).
– Dustin Klein 21.07.2011
|
||
|
Das mit dem Verschleppen von Zuweisungsfehler finde ich auch besonders schlimm und kritisch. Auch deswegen setze ich var nicht gerne ein.
– CodeSniffer 21.07.2011
|
||
|
Ich kenne Entwickler die aufgrund von Resharper-Hinweise alles auf var umstellen. Also genau umgekehrt ;-)
– CodeSniffer 21.07.2011
|
||
|
Ganz ehrlich - ich hab den ReSharper auch mal ne Zeit lang ausprobiert und mir ist das zu viel und zu bunt. Und wenn der solche Vorschläge bringt, ...; ich hab DevExpress Refactor/CodeRush, diese Tools sind nicht so aufdringlich (ReSharper war mir zuviel Funktionalität in einem Tool, die immer irgendwie gleichzeitig zu laufen scheint).
– ffordermaier 21.07.2011
|
||
|
Von ReSharper bin ich sehr überzeugt. Am Anfang erscheint es schon recht bunt. Gewöhnt man sich aber daran, möchte man es nicht mehr missen. Die Vorschläge und Farben kann man in den Optionen konfiguriern. So habe ich z.B. var abgeschaltet.
– CodeSniffer 26.07.2011
|
Im folgenden Beispiel werden zwei Abfrageausdrücke veranschaulicht. Im ersten Ausdruck ist der Gebrauch von var zulässig, jedoch nicht erforderlich, da der Typ des Abfrageergebnisses explizit als IEnumerable<string> angegeben werden kann. Im zweiten Ausdruck hingegen muss var verwendet werden, da das Ergebnis eine Auflistung von anonymen Typen ist und der Name des Typs nur für den Compiler selbst zugänglich ist. Beachten Sie, dass in Beispiel 2 die foreach-Iterationsvariable item ebenfalls implizit typisiert sein muss.
// Example #1: var is optional because
// the select clause specifies a string
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
where word[0] == 'g'
select word;
// Because each element in the sequence is a string,
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
Console.WriteLine(s);
}
// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
// var must be used because each item
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}
|
|
|
Zur Aussage von Microsoft: Ich habe es zwar nicht schriftlich, aber auf einer Schulung von Microsoft wurde dazu folgendes gesagt:
var wurde nur deshalb eingeführt, um die unbekannten Ergebnisse von Linq-Ausdrücken einer quasi typisierten Variablen zuweisen zu können. Für alle anderen Fälle wird von Microsoft empfohlen (Aussage des Lehrers), die vollständige Deklarationssystax zu verwenden. Ich persönlich mag var nicht, denn ich will auf den ersten(!) Blick sehen, um welchen Typ es sich handelt. Und zuerst suche ich diesen immer links der Zuweisung. – Andreas Ganzer 21.07.2011
|
||
|
Ist auch meine persönliche Meinung. Wenn es klar ersichtlich ist *kann* man var benutzen, ich tendiere aber auch lieber zur expliziten Typisierung.
– Dustin Klein 21.07.2011
|
var numbers = new[] { 3, 1, 2 };
var orderedNumbers = numbers.OrderBy( number => number );
var firstNumber = orderedNumbers.First( );stattint[] numbers = new int[] { 3, 1, 2 };
IOrderedEnumerable<int> orderedNumbers = numbers.OrderBy<int, int>( ( int number ) => number );
int firstNumber = orderedNumbers.First<int>( );var numbers = new[] { 3m, 1m, 2m };
var orderedNumbers = numbers.OrderBy( number => number );
var firstNumber = orderedNumbers.First( );stattdecimal[] numbers = new decimal[] { 3m, 1m, 2m };
IOrderedEnumerable<decimal> orderedNumbers = numbers.OrderBy<decimal, decimal>( ( decimal number ) => number );
decimal firstNumber = orderedNumbers.First<decimal>( );
|
|
|
"den Rest decken die Tests ab, die ja sowieso in allen Projekten in Übermaß vorhanden sind *g* - sind wir nicht alle Musterschüler" - Allein dafür bekommst du schon ein +1 von mir ;-)
– Dustin Klein 21.07.2011
|
||
|
Ich sehe - gerade bei numerischen Datentypen - das Problem, das man sich da ganz schnell ins Bein schießen kann. Während ein Vergleich (i == j) für int i,j wohldefiniert ist, gerätst du für double i,j in Schwierigkeiten (Thema: Genauigkeit der Gleitkommadarstellung). Mit einem var übersieht man das meiner Meinung nach leichter.
– ffordermaier 21.07.2011
|
||
|
Das stimmt natürlich ebenfalls (und sollte im Idealfall durch Tests ans Tageslicht kommen - darauf zu hoffen ist auch nicht der richtige Ansatz).
Allerdings gilt das auch für die manuelle nachbearbeitung und bei der Refactoring-Variante. Ganz das Hirn abschalten darf man wohl nie ;) – WolfgangKluge 21.07.2011
|
|
|
|
Danke, sehr guter Beitrag. Das deckt sich auch größtenteils mit meinen Vorstellungen.
– CodeSniffer 27.07.2011
|
||
| 2 |
@Golo: falls Du hier mal wieder reinschauen solltest, könntest Du vielleicht den Link reparieren? Der scheint inzwischen ins Leere zu führen.
– Matthias Hlawatsch 15.04.2012
|
|
| 1 |
Nicht nur der Link. Im ganzen Blog steht mittlerweile leider quasi nichts mehr - was ich persönlich sehr schade finde denn dort waren doch ein paar informative Artikel.
– Jens Duczmal 15.04.2012
|
var memberAttr = reflectionProvider.GetSingleAttributeOrDefault<SerializationAttribute>(memberInfo);
|
|
| 1 |
Jein: Wenn ich memberAttr verwende, sehe ich - dank Intellisense - auch welcher Typ er ist. Und in der Deklaration habe ich den Datentyp ja ohnehin auch stehen. Ich denke nicht, dass die Codeleserlichkeit ernsthaft gefährdet ist.
– nabuchodonossor 21.07.2011
|
|
|
Und - je weniger ich schreiben muss, umso früher wird geliefert und Kunde bezahlt. Aufgrund der Schnelllebigkeit unserer Branche mache ich mir um die Evolvierbarkeit des Codes keine Gedanken mehr. Bis der Kunde wieder bestellt, ist mindestens eine Technikgeneration weitergegangen, und man muss meist eh alles wieder schmeissen.
– nabuchodonossor 21.07.2011
|
||
| 1 |
Kommt natürlich auch darauf an wieviele Leute gemeinsam am Code arbeiten. Bei einem größeren Team erleichtert eine genaue Deklaration die Lesbarkeit schon enorm.
– CodeSniffer 21.07.2011
|
|
|
Hilfreich finde ich var allerdings oft bei den Ergebnissen von LINQ-Statements. Gerade hier kann es die Lesbarkeit erhöhen.
Fazit: Im großen und ganzen lehne ich var ab; aber bei nicht exzessiver Nutzung kann es in Einzelfällen hilfreich sein.