Hallo,
Ich hoffe das ist keine Grundlagen-Frage, aber ich habe keine SINNVOLLE/ÜBERZEUGENDE Antwort dafür im Netz gefunden...
Ich sehe oft Code in welchem mit var statt mit dem expliziten Datentyp gearbeitet wird. Ich verstehe da oft nicht weshalb. Es gibt sicher sinnvolle Szenarien für die Verwendung von var (Typ des Rückgabewerts steht nicht fest, LINQ etc). Diese "Begründung" für var findet man auch im Netz und das ist mir in dem Zusammenhang auch plausibel.
Warum aber wird so oft var verwendet, obwohl der Typ im Context sehrwohl feststeht und auch garnicht anders sein kann??? Also quasi man ruft ne Funktion auf, deren Rückgabewert vom Typ A ist, schreibt aber trotzdem var instOfA = GetA(); und nicht A instOfA = GetA();
Ich finde der Code wird so viel schwerer lesbar und deshalb frage mich nach den Vorteilen wenn DER TATSÄCHLICHE TYP einer Variablen EINDEUTIG FESTSTEHT? Denn für mich sieht das oft so aus "hmm ich nehm mal var dann brauch ich mir zum jetzigen Zeitpunkt keine Gedanken drüber machen was da überhaupt zurückkommt".
gruß
sth_Weird
Linux is for free...if your time is worth nothing
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht
++++++++++++++++++++~+
Du hast evtl den Sinn oder die Funktionsweise von var
nicht verstanden, denn ohne genauen Typ kann man var
nicht verwenden.
Wenn der Typ nicht fest steht geht nur object
oder dynamic
- aber nicht var
.
var
ist einfach schneller zu tippen und macht für die meisten den Code übersichtlicher, sonst hat es quasi keinerlei Vorteile.
Beim Kompilieren wird ohnehin der Originaltyp verwendet.
Ich verwende var
überall, wo der Typ durch die Deklaration ohnehin eindeutig fest steht.
Ich sehe oft Code in welchem mit var statt mit dem expliziten Datentyp gearbeitet wird. Ich verstehe da oft nicht weshalb. Es gibt sicher sinnvolle Szenarien für die Verwendung von var (Typ des Rückgabewerts steht nicht fest, LINQ etc). Diese "Begründung" für var findet man auch im Netz und das ist mir in dem Zusammenhang auch plausibel.
Wenn das irgendwo steht ist das eindeutig falsch.
LINQ returnt bei anonymen Rückgaben (wie zb Select(x=> new { .. } )
) nämlich dynamic
.
Siehe Antwort von pdelvo.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Sicherlich kann man darüber streiten und gerade wenn komplexere Methoden einen Rückgabetyp haben, der aus dem Namen nicht klar wird (was nicht sein sollte, aber kommt vor), dann gebe ich dir recht: Der konkrete Typ fördert die Lesbarkeit.
Wenn aber der konkrete Typ auf einen Blick sichtbar ist, dann bietet var eine Vereinfachung während der Arbeit, weil es einfach leichter von der Hand geht.
Es fässt auch den Code kleiner zusammen, weil die längeren Typ-Namen am Anfang weg fallen, die Namen stehen also genau untereinander.
Das sind jetzt so die Argumente, die mir einfallen, sicherlich gibt es noch Weitere dafür oder dagegen.
Ich persönlich nutze var fast immer. Ausnahme ist z.B. die Deklaration einer Variable ohne Instanziierung, da is var logischer Weise nicht möglich.
Mitlerweile habe ich mich auch daran gewöhnt, den Code so zu schreiben (und die Kollegen genauso), dass der konkrete Typ gar nicht nötig ist um den Code zu verstehen.
Kleine Methoden, sprechende Namen, übersichtliche Strukturierung. Dann ist der konkrete Typ im Idealfall nur noch als Detail-Information nötig.
Abgesehen davon hilft bei großen Projekten irgendwann allein der Name des konkreten Typs gar nicht mehr, weil der Umfang einfach zu komplex ist. Dann ist eine genaue Benennung sowieso zwingend notwendig um den Überblick zu halten.
Mit der Zeit merkt man sich auch die Klassen und Funktionen im .NET und weiß dann einfach, was von welcher Methode zurück gegeben wird.
Es ist sicherlich irgendwo auch Geschmackssache, aber der Nachteil, dass man den Typ nicht sofort sieht, ist meiner Meinung nach später gar nicht mehr so wichtig, ich muss ja sowieso den konkreten Typ im Detail anschauen und das geht über var (Kontextmenu -> Go to definition) genauso gut, wie über jeden anderen Typ auch.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Wenn das irgendwo steht ist das eindeutig falsch.
LINQ returnt bei anonymen Rückgaben (wie zbSelect(x=> new { .. } )
) nämlichdynamic
.
Das stimmt nicht. Der Typ ist ja auch nicht dynamisch, sondern trotzdem statisch. Im Intellisense wird er mit a' Bezeichnet und zugreifen kann man mit var und bekommt funktionierendes IntelliSense.
var temp = new
{
Name = "Mustermann",
Vorname = "Max"
};
var result = from x in Enumerable.Range(1, 100)
select new
{
Temp = 1
};
var n = result.First();
sorry meine Ausdrucksweise war sehr missverständich...selbstverständlich muss ich letztendlich einen konkreten Typ haben aber der ist auf den ersten Blick halt nicht ersichtlich bzw. es ist nicht notwenig ihr genau zu definieren.
Folgendes Beispiel habe ich im Netz gefunden:
var result =
from s in aBunchOfWords
where s.Length == 5
//Creates a new anonymous type with name/value pairs
select new {Value=s, Length=s.Length, FirstThreeLetters=s.Substring(0,3)};
//Print values
foreach (var x in result)
Console.WriteLine("Value: {0}, Length:{1}, SubString:{2}",
x.Value, x.Length, x.FirstThreeLetters);
This prints:
Value: Hello, Length:5, SubString:Hel
Value: World, Length:5, SubString:Wor
wenn ich irgendwo "weiter unten im Code" mit result arbeite dann sehe ich nur dass es var ist. Wenn ich später lustig bin und jetzt keine Length Info mehr will dann lasse ich das einfach in der select-new-Klammer weg, result ändert sich dann natürlich, aber der Typ = var nicht.
Sicherlich, man erspart sich Schreibarbeit, im obigen Fall müsste man sonst ja ne Klasse oder Struktur anstelle von var erstellen...ich denke halt einfach (wenn es keine sonstigen Vorteile hat) dass es auf Kosten der Lesbarkeit geht. Es gibt auch mal Fälle da bekommt man Roh-Code auf Papier vorgelegt oder hat keine komfortable Entwicklungsumgebung sondern nur einen Texteditor und soll dann was analysieren. Da würde ich mir dann konkrete Typen loben...dass der Code außenrum "schön" und eindeutig verständlich ist oder dass eine brauchbare Doku vorliegt, das ist meist Wishful Thinking und man kann sich leider nicht immer verlassen 😦
nichtsdestotrotz, mir reicht soweit schonmal die Antwort, dass es außer schnellerem Tippen (und vielleicht wie im Beispiel oben Code sparen) keine Vorteile bringt... deshalb sehe ich das als gelöst an
gruß
sth_Weird
Linux is for free...if your time is worth nothing
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht
++++++++++++++++++++~+
Du arbeitest hier mit anonymen Typen und nicht mit typisierten Klassen. was erwartest Du nun? 🤔var
ist hier ein Platzhalter.
Du hast hier gar keine Möglichkeit einen konkreten Typ zu verwenden. Da müsste das Select schon ganz anders aussehen:
IEnumerable<MyType> myCollection = from a in b select new MyType(...);
PS: Name-Value Pairs produziert das Linq hier auch nicht. Die Doku der Zeile ist also auch "suboptimal".
Das Linq prodziert hier nichts anderes als eine Collection voll mit anonymen Typ mit 3 Eigenschaften, die sich Verhalten wie reguläre Klasseneigenschaften.
Sowas ist nicht schlecht: aber man sollte es verstehen und es sollte sich im Rahmen halten.
Hinzu kommt, dass dynamic nicht an eine andere Methode übergeben werden kann. Aufgrunddessen ist die Nutzung immer nur im eigenen Scope von dynamic möglich.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo sth_Weird,
zwingend ist die Verwendung von var nur dann, wenn es um feststehende, aber anonyme Typen geht. Da hat man keine Chance, den echten Typ hinzuschreiben, eben weil er keinen Namen hat. Soweit ich weiß, benötigt man das vor allem bei bestimmten Linq-Konstruktionen. Und das ist vermutlich der Grund, warum var überhaupt eingeführt wurde.
Ansonsten hilft var, den Code DRY zu halten, z.B. bei
var myDict = new Dictionary <String, List <int>> ();
statt
Dictionary <String, List <int>> () myDict = new Dictionary <String, List <int>> ();
Zwingend erforderlich ist die Verwendung von var hier natürlich nicht. Ich finde jedoch schon, dass der Code in solchen Fällen übersichtlicher und besser lesbar wird. Doch das ist natürlich Ansichtssache.
Wegen dieses DRY-Effekts finde ich es schade, dass man var nicht für Membervariablen benutzen kann. Allerdings weiß ich jetzt auch, warum man das nicht kann, nämlich damit anonyme Typen nicht über Methodengrenzen hinweg verwendet werden, was der Verständlichkeit sicher abträglich wäre.
Siehe auch Implizit typisierte lokale Variablen (C#-Programmierhandbuch).
herbivore
"hmm ich nehm mal var dann brauch ich mir zum jetzigen Zeitpunkt keine Gedanken drüber machen was da überhaupt zurückkommt".
Dann hast du den Sinn von "var" ja verstanden 😉
Herbivore hat recht: Manchmal (aber nur dann) ist es sinnvoll, wenn man var verwendet.
Ob dus nimmst oder nicht ist in allen andren Fällen Ansichtssache. Oft wird es aber auch aus "Faulheit" gemacht.
Es gibt solche Agreements, dass man sagt: "Vor einem "new" kann man var-schreiben, weil man den Typen ja gleich sieht". Das unterschreibe ich. Funktioniert aber in der Praxis so gut wie nie. Dann wird mit vars um sich geschmissen, dass es nur so kracht. Ich verwende es nie. Zumal der ReSharper ja auch gleich das Ganze als richtigen Typ auflösen kann.
Ich persönlich finds überflüssig, bis auf den von herbivore genannten Fall. Aber das ist, wie fast alle hier schon gesagt haben, Ansichtssache 😉
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Wenns geht versuche ich die Verwendung von var zu vermeiden.
Ich empfinde das einfach als nicht schön zu lesen, vorallem wenn man mal in Projekte anderer rein muss und dann erstmal die Objekte verstehen muss.
Mag schon sein das die IDE da auch einem bei hilft aber ich persönlich versuche erst garnicht solche hürden für andere zu stellen.
Und auch Microsoft sagt ja:
Der Einsatz von var kompliziert jedoch potenziell Ihren Code, sodass andere Entwickler ihn nur schwer nachvollziehen können. Aus diesem Grund wird in der C#-Dokumentation var im Allgemeinen nur verwendet, wenn es erforderlich ist.
Hallo zusammen
Meines Wissens wurde var wirklich nur für das Feature "Anonymous Types" eingeführt.
Man kann es so sinnvoll nutzen oder eben auch missbrauchen.
Einige Dinge sind schon genannt worden, die ich auch in einem Blogpost von mir beschreibe.
Ich nutze var nur bei anonymen Typen, ausser bei ein paar Ausnahmen, bei denen ich die Verwendung angebracht finde.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Die Verwendung von var wird in den C# Coding Conventions (Abschnitt: "Implicitly Typed Local Variable") empfohlen.
Viele benutzen Resharper, der eine Warnung gibt, wenn Du kein var benutzt.
Hallo weismat
Ja empfohlen unter bestimmten Bedingungen und davon abgeraten auch unter bestimmten Bedingungen.
Wäre noch wichtig zu erwähnen.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Die Verwendung von var wird in den
> empfohlen.
Das stimmt nicht. Zumindest nicht generell. Wie peter schon sagte.
Do not use var when the type is not apparent from the right side of the assignment.
Avoid the use of var in place of dynamic.
Es ist, wie ich schon geschrieben habe, immer empfohlen "var" zu verwenden, wenn gleich daneben ersichtlich ist, was es für ein Typ ist. (U.a. wird das bei einem "new" sichtbar).
Do not rely on the variable name to specify the type of the variable. It might not be correct.
Ich persönlich benutze es absolut nicht.
Zitate von: C# Coding Conventions
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Ich habe schon kritisiert, dass bei Vorträgen oft "var" genommen wird immer mit der Ausrede mal sei zu faul zu tippen, die Vortragenden aber meistens mehr tippen mussten als wenn sie gleich den richtigen Datentyp genommen hätten.
Beispiel :
var lvi1 = new ListViewItem();
ListViewItem lvi2 = new ListViewItem();
Für die zweite Zeile benötige ich weniger Tastendrücke.
Ich benutze kein "var" außer in den zwingenden Fällen die herbivore genannt hat.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Ich benutze generell kein 'var' wenn es nicht zwingend sein muss. Den extra-Schreibaufwand nehme ich gerne in Kauf um die Lesbarkeit und Verständlichkeit des Codes zu steigern.