Laden...

Weshalb var anstelle des konkreten Datentyps verwenden?

Erstellt von sth_Weird vor 10 Jahren Letzter Beitrag vor 9 Jahren 4.579 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 10 Jahren
Weshalb var anstelle des konkreten Datentyps verwenden?

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

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

16.835 Beiträge seit 2008
vor 10 Jahren

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.

2.079 Beiträge seit 2012
vor 10 Jahren

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.

1.346 Beiträge seit 2008
vor 10 Jahren

Wenn das irgendwo steht ist das eindeutig falsch.
LINQ returnt bei anonymen Rückgaben (wie zb Select(x=> new { .. } ) ) nämlich dynamic.

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();
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 10 Jahren

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

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

16.835 Beiträge seit 2008
vor 10 Jahren

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.

49.485 Beiträge seit 2005
vor 10 Jahren

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

2.207 Beiträge seit 2011
vor 10 Jahren

"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

S
145 Beiträge seit 2013
vor 10 Jahren

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.

5.941 Beiträge seit 2005
vor 10 Jahren

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

W
872 Beiträge seit 2005
vor 10 Jahren

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.

5.941 Beiträge seit 2005
vor 10 Jahren

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

2.207 Beiträge seit 2011
vor 10 Jahren

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

3.825 Beiträge seit 2006
vor 10 Jahren

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

M
171 Beiträge seit 2012
vor 9 Jahren

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.