Ich habe gerade angefangen, ReSharper mit Visual Studio zu verwenden (nach den vielen Empfehlungen zu SO). Zum Ausprobieren habe ich ein aktuelles ASP.NET MVC-Projekt geöffnet. Eines der ersten und häufigsten Dinge, die mir aufgefallen sind, ist, die meisten / alle meine expliziten Erklärungen var
stattdessen zu ändern . Beispielsweise:
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
und so weiter, auch mit einfachen Typen wie int
, bool
usw.
Warum wird dies empfohlen? Ich komme nicht aus der Informatik oder dem .NET-Hintergrund, da ich kürzlich in die .NET-Entwicklung "hineingefallen" bin, daher würde ich gerne verstehen, was los ist und ob es von Nutzen ist oder nicht.
var
, auch wenn der Typ überhaupt nicht offensichtlich ist! der Grund ist , weil es zwingt mich am meisten beschreibenden Namen zu wählen , ich kann kommen und letztlich macht , dass der Code viel, viel besser lesbar. Letztendlich hilft es auch, die Logik von der Implementierung zu trennen. Das ist natürlich nur meine Meinung, ich hoffe es würde jemandem helfen;).Antworten:
Ein Grund ist die verbesserte Lesbarkeit. Welches ist besser?
oder
quelle
var
für alles verwenden - ich mache viele, viele Codeüberprüfungen mit TFS (webbasierte Unterschiede) und es macht meine Arbeit extrem schwierig: dhvar items = GetSomeItems();
vsIDataReader dr = GetSomeItems();
Fehlende Verwendung von Anweisungen für beide, aber für mich leichter zu fangen, wenn ichIDataReader
vs verwendevar
.Was ReSharper vorschlägt, ist eine deutliche Überbeanspruchung des Schlüsselworts var. Sie können es verwenden, wenn der Typ offensichtlich ist:
Wenn der Typ nicht offensichtlich ist, sollten Sie ihn lieber aufschreiben:
quelle
var
und nicht "eindeutig" die eine oder andere Sache. Ich ziehe es vor, keine Dinge einzugeben, die der Compiler selbst herausfinden kann. Ich mag Inferenz vom Typ C # und wünschte oft, sie wäre so gut wie Inferenz vom Typ F #. Wenn ich könnte, würde ich explizite Typen aus Methodenparametern und Rückgabetypen weglassen, wie es in F # üblich ist. Natürlich sind sich nicht alle einig.Stream
Objekt heißt beispielsweiseRead
nichtReadAndReturnNumberOfBytesAsInt32
.Ich persönlich ziehe es vor, diesen Vorschlag auszuschalten. Die Verwendung
var
kann häufig die Lesbarkeit verbessern. Aber wie Sie bereits erwähnt haben, wird es manchmal reduziert (bei einfachen Typen oder wenn der resultierende Typ dunkel ist ).Ich wähle lieber, wann ich benutze
var
und wann nicht. Aber das bin nur ich.quelle
var
ziemlich oft.var methodXYResultIntArray
. Das ist gegen alle Kodierungsstandards und weniger prägnant alsint[] methodXYResult
. Wenn Siebyte[]
in Zukunft eine von der Methode zurückgeben möchten, sind alle Ihre Variablennamen falsch. Mit expliziten Typen können Sie dies sehr einfach umgestalten. Es gibt Gründe zu verwendenvar
, zB mit aDictionary<string, List<SomeType<int>>>
. Wenn der vollständige Typname jedoch nicht zu lang ist und Sie keinen Resharpernew
auf der rechten Seite (oder eine explizite Besetzung) verwenden, sollte dies nicht empfohlen werden.var
kann die Lesbarkeit des Codes verbessern und gleichzeitig das sofortige Verständnis des Codes verringern. Trotzdem kann es die Lesbarkeit des Codes für andere Situationen beeinträchtigen. Manchmal ist die Verwendung neutral. Das Maß für die Lesbarkeit zum Verständnis ist nicht proportional, sondern hängt von der Situation ab. Manchmal werden beide zusammen erhöht oder verringert.Der Faktor ist, worauf
var
angewendet wird und wie gut das Ziel die sofortige Verschleierung seines Datentyps für den Leser unterstützt oder ob seine Typinformationen benötigt werden, um den vorliegenden Programmteil zu verstehen.Beispielsweise kann eine schlechte Benennung dazu führen,
var
dass das Codeverständnis abnimmt. Dies ist jedoch nichtvar
die Schuld:Manchmal ist es nicht sinnvoll,
var
für einfache Datentypen zu verwenden, wenn Code in Abwesenheit besser lesbar ist:Manchmal
var
kann es nützlich sein, Datentypinformationen auszublenden, bei denen Sie nicht unbedingt die Komplexität von:Sie müssen verwenden,
var
wenn ein anonymer Typ vorhanden ist, da kein Typname zum Aufrufen vorhanden ist:Wenn Visual Studio Intellisense trotz allem Typinformationen bereitstellt
var
, müssen Sie sich weniger auf Ihr Verständnis durch striktes Lesen des Codes ohne Hilfe verlassen. Es ist wahrscheinlich ratsam anzunehmen, dass nicht jeder Intellisense hat oder verwendet.Zusammenfassend würde ich anhand der obigen Beispiele vorschlagen, dass die Anwendung von Carte Blanche
var
keine gute Idee ist, da die meisten Dinge am besten in Maßen und basierend auf den hier gezeigten Umständen erledigt werden.Warum verwendet Resharper es standardmäßig überall? Ich würde es zur Vereinfachung vorschlagen, da es die Nuancen von Situationen nicht analysieren kann, um zu entscheiden, wann es am besten nicht verwendet werden soll.
quelle
var
, es wird Sie zwingen, anständige Methodennamen zu schreiben.GetNumber() -but what type?
- Nun, warum kümmert es dich? Wenn es so wichtig ist zu wissen, rufen Sie die Methode aufGetNumberAsDouble()
, dann ist es genauso klar und funktioniert, wenn Sie eine Methode zurückgebenstring
und eine zurückgebendouble
.In ReSharper (8.02, aber wahrscheinlich auch in anderen Versionen) kann die Option für den Vorschlag "Implizit typisierte lokale Variablendeklaration verwenden" an Ihre Präferenz angepasst werden, indem Sie zuerst das Optionsmenü für ReSharper öffnen:
Dann unter "Code Inspection" durch Anpassen des "Inspection Severity" Ihrer gewählten Sprache, in meinem Fall c #:
Wie Sie sehen, gibt es Optionen zum Anpassen aller Vorschläge von ReSharper. Hoffe, das hilft jemandem wie mir, der bereits eine 'var'-Nutzungsstrategie hat und nur möchte, dass ReSharper diese respektiert :)
quelle
Ich bin überrascht, dass niemand erwähnt hat, dass es auch einfacher ist, den Typ des instanziierten Objekts zu ändern, weil
ist eine Form der Wiederholung . Wenn ich
AVeryLongTypeName
in eine der abgeleiteten Klassen wechseln möchte , muss ich dies bei Verwendung nur einmal ändernvar
und kann weiterhin auf Methoden der untergeordneten Klassen zugreifen.Abgesehen davon ist die verbesserte Lesbarkeit ein wichtiger Punkt, aber wie andere sagten, sollte var nicht überbeansprucht werden, daher denke ich, dass es absolut in Ordnung ist, den Hinweis in Resharper auszuschalten.
quelle
Bei 'var' geht es darum, klar zu sein
Die Hauptdebatte darüber, ob das
var
Schlüsselwort verwendet werden soll oder nicht, besteht darin, wie lesbar der Code für Sie und andere Entwickler ist.Als ob Sie eine Geschichte schreiben würden, gibt es keine endgültige richtige Antwort. Aber schauen wir uns einige Beispiele dafür im Klartext an.
Wer ist den anderen Weg gegangen? Jake oder Bill? In diesem Fall entspricht die Verwendung der Namen "Jake" und "Bill" der Verwendung des Typnamens. Und "Er" und "Ihn" ist wie das Verwenden des
var
Schlüsselworts. In diesem Fall kann es hilfreich sein, genauer zu sein. Das Folgende ist zum Beispiel viel klarer.In diesem Fall machte eine genauere Darstellung den Satz klarer. Aber das wird nicht immer der Fall sein. In einigen Fällen ist es schwieriger zu lesen, wenn man spezifisch ist.
In diesem Fall wäre es einfacher, den Satz zu lesen, wenn wir "er" verwenden und in einigen Fällen seinen Namen alle zusammen weglassen würden, was der Verwendung des
var
Schlüsselworts entspricht.Diese Beispiele decken den Kern ab, aber sie erzählen nicht die ganze Geschichte. In diesen Beispielen gab es nur einen Weg, sich auf die Person zu beziehen. Entweder durch Verwendung ihres Namens oder durch Verwendung eines allgemeineren Begriffs wie "er" und "ihn".
Im Fall von Code haben wir drei Möglichkeiten, um Klarheit zu schaffen. Der Typ, der Variablenname und die Zuordnung. Nehmen Sie zum Beispiel diese Codezeile:
Es stellt sich nun die Frage, ob in dieser Codezeile genügend Informationen enthalten sind, um herauszufinden, was los ist.
Was ist mit der folgenden Codezeile? Würdest du noch wissen, was
p
in diesem Fall bedeutet:Wie wäre es jetzt:
Oder jetzt:
Oder dieses:
Oder dieses:
Ob das Schlüsselwort
var
in einem bestimmten Szenario funktioniert, hängt stark vom Kontext des Codes ab, z. B. davon, wie die Variablen, Klassen und Methoden benannt werden. Dies hängt auch von der Komplexität des Codes und dem Rest des ihn umgebenden Codes ab.Persönlich verwende ich gerne das
var
Schlüsselwort, das für mich die meiste Zeit umfassender ist. Aber ich neige auch dazu, meine Variablen nach dem Typ zu benennen, damit ich nicht wirklich Informationen verliere.Das heißt, manchmal, abhängig vom Kontext, in dem ich Ausnahmen mache, ist dies die Natur von allem Komplexen, und Software ist nichts, wenn nicht komplex.
quelle
var
, solange ich weiß, was es ist, während ich diese eine Zeile lese. Wenn ich keine Ahnung habe, welche Methode eine andere Lösung mit einem anderen Domänenmodell zurückgibt, habe ich diesen Typ lieber explizit definiert, um das Lesen zu vereinfachen. +1Ich mochte das auch nicht.
Ich möchte nicht, dass dies zu einer Debatte über die Verwendung von wird
var
, es hat seine Verwendung, sollte aber nicht überall verwendet werden.Das Wichtigste ist, dass ReSharper nach den von Ihnen gewünschten Codierungsstandards konfiguriert ist.
Edit: ReSharper und var
quelle
Ich sehe viele richtige Antworten, aber es fehlt die vollständige.
Es ist wahr, dass ReSharper
var
standardmäßig überbeansprucht wird. Ich denke, die meisten Leute würden dem zustimmen. Es ist auch einfacher zu lesen, wannvar
es verwendet wird, und der Typ ist offensichtlich, z. B. wenn Sie einenew
Anweisung verwenden. Ich habe einen Beitrag gesehen, in dem gezeigt wurde, wie der Schweregrad der Inspektion aktualisiert wird, um nur Hinweise für die Verwendung von anzuzeigenvar
.Ich hatte versucht, zuerst andere Beiträge zu kommentieren, um hinzuzufügen, wo diese gesetzt werden sollen, hatte aber nicht den Ruf dafür. Anscheinend hatte ich auch nicht den Ruf, meinen Screenshot der Einstellungen zu veröffentlichen.
Ich werde erklären, wie man dorthin kommt.
In Visual Studio> Hauptmenü> Resharper> Optionen> Codebearbeitung> C #> Codestil> Var-Verwendung in Deklarationen
ReSharper-Hilfedokumentation: Codesyntaxstil: Implizite / Explizite Typisierung (Schlüsselwort 'var') - Konfigurieren Sie die Einstellungen für die Verwendung des Schlüsselworts 'var'
quelle
Meine Regel lautet:
Deklarieren Sie eine primitive Art (dh
byte
,char
,string
,int[]
,double?
,decimal
, etc.)? -> Verwenden Sie den Typ:Deklarieren Sie einen komplexen Typ (dh
List<T>
,Dictionary<T, T>
,MyObj
)? -> Verwenden Sievar
:quelle
string myStr = "foo";
ist offensichtlich, dass es eine Zeichenfolge ist. Ich würde alle Ihre Beispiele in die Kategorie var verwenden ... und Deklarationen, die von einer Methode zur Verwendung des Explizitätstyps zurückgegeben werden. Aber am Ende des Tages ist es alles, was Sie und Ihr Team für das jeweilige Projekt für besser halten.Ich möchte nur darauf hinweisen, dass die Verwendung von "var" in den C # -Codierungskonventionen empfohlen wird
Das ist wahrscheinlich der Grund, warum der Tipp in ReSharper standardmäßig aktiviert ist. Sie bieten auch einige Fälle, in denen die Lesbarkeit direkt im selben Dokument nicht verbessert wird.
quelle
System.Diagnostics.PerformanceCounter()
- Sie können den Leistungsindikator leicht anhand der eingebauten Diagnoseklasse erkennen. Aber welcher Typ wird hier zurückgegeben?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? Kein Hinweis auf die Taktung, insbesondere wenn Ihre Lösung weit über 100 Projekte enthält.ReSharper empfiehlt,
var
da es dazu neigt, die Objekterstellung übersichtlich zu gestalten.Vergleichen Sie diese beiden Beispiele:
Es ist nur eine Kurzschrift, die leichter zu lesen sein soll.
Ich denke, es ist in Ordnung, wenn Sie neue Objekte explizit mit "new" erstellen. In Ihrem Beispiel ist es jedoch möglicherweise nicht offensichtlich, ob die Klassen nicht richtig benannt wurden.
quelle
Übrigens unterscheidet ReSharper zwischen "Sie möchten diesen Vorschlag möglicherweise auf Ihren Code anwenden" und "Ihr Code ist fehlerhaft, soll ich ihn beheben?". Das
var
Schlüsselwort befindet sich in der Kategorie "Vorschläge", zusammen mit Dingen wie "Invertieren, wenn die Verschachtelung reduziert werden soll". du musst ihm nicht folgen.Sie können konfigurieren, wie ärgerlich die einzelnen Warnungen sind, indem Sie das Dialogfeld "Optionen" oder direkt das Popup-Menü für diese Warnung verwenden. Sie können Dinge wie den
var
Vorschlag herabstufen , damit sie weniger auffällig sind, oder Sie können Dinge wie die Warnung "Erweiterungsmethode verwenden" aktualisieren, damit sie als tatsächlicher Fehler angezeigt wird.quelle
Die
var
Funktion von .Net 3.0 ist nur die Typinferenz , die typsicher ist und häufig das Lesen Ihres Codes erleichtert. Sie müssen dies jedoch nicht und können diese Empfehlung in Resharper deaktivieren, wenn Sie möchten.quelle
Var ist unglaublich! Ich bin auf viele Entwickler gestoßen, die den Eindruck haben,
var
an einen dynamischen Typ gebunden zu sein, das ist es nicht. Es ist immer noch statisch typisiert, es wird nur vom Compiler entschieden.Hier sind einige erstaunliche Vorteile der Verwendung von var
Weniger typing var ist kürzer und leichter zu lesen, zum Beispiel
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Yuk.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Beschreibendere Variablennamen - dünn, aber ich denke, es ist wichtig, die fließende Natur des
var
Leuchten hier zum Leuchten zu bringen. Wievar
es ein bisschen vage ist, ermutigt es wirklich einen eher beschreibenden Variablennamen, anstatt den Typ für sich selbst sprechen zu lassen.Weniger Codeänderungen - wenn sich der Rückgabetyp eines Methodenaufrufs ändert. Sie müssen nur den Methodenaufruf ändern, nicht jeden Ort, an dem er verwendet wird.
Anonyme Typen - anonyme Typen sind ein wirklich leistungsfähiges Konzept, vor allem in Bereichen wie WebAPI Teilressourcen . Ohne var können sie nicht verwendet werden.
Manchmal ist es jedoch nützlich, Typen explizit zu deklarieren, und ich finde dies am nützlichsten in Grundelementen oder Strukturen. Zum Beispiel finde ich diese Syntax persönlich nicht sehr nützlich:
vs.
Es hängt alles
var
von Ihren persönlichen Vorlieben ab, aber die Verwendung wird Ihre Entwicklung wirklich beschleunigen und eine ganze Welt anonymer Typgüte freischalten.quelle
Es gibt keinen technischen Unterschied. Wenn Sie var verwenden, wird der Typ vom Compiler impliziert. Wenn Sie einen Code wie diesen haben:
x ist ein int und es können keine anderen Werte zugewiesen werden.
Das Schlüsselwort var ist nützlich, wenn Sie den Typ der Variablen ändern. Sie müssen dann nur eine Änderung anstelle von zwei vornehmen:
quelle
Das
var
Schlüsselwort wurde in C # 3.0 eingeführt. Dadurch können wir vergessen, unseren Typ explizit anzugeben.Es gibt keinen wirklichen Unterschied, ob Sie verwenden
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
oder
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
außer reine Lesbarkeit und geringere Fehlerwahrscheinlichkeit.
Es scheint ein klischeehaftes Beispiel zu sein, aber sagen Sie, dass Folgendes Ihrem Verständnis helfen kann:
gibt einen
int
Typ zurück, währendgibt einen
string
Typ zurück.MSDN-Referenz
quelle
Die Angabe eines expliziten Objekttyps ist irgendwie redundant. Sogar ins Englische übersetzt klingt das überflüssig: "Ein Objekt vom Typ X in eine Variable vom Typ X einfügen" vs "Ein Objekt vom Typ X in eine Variable einfügen".
Die Verwendung von 'var' hat jedoch ihre Grenzen . Es verhindert die folgende Verwendung von Polymorphismus, der reine Schönheit ist :
Angenommen, ein Hund erweitert das Tier. Katze erweitert Tierklassenhierarchie:
Derselbe Code, bei dem x mit 'var' deklariert ist, wird nicht kompiliert .
Zurück zur ursprünglichen Frage: Ich verwende Resharper nicht, aber ich gehe davon aus, dass dies klug genug ist, um zu erkennen, wann 'var' nicht verwendet werden soll. :-)
quelle
as
) ist schrecklich. Sie verwandeln Kompilierungsfehler in Laufzeitfehler, wenn Sie so etwas wieAnimal x = new Cat(); DoStuffWithDog(x as Dog);
Warum x wiederverwenden? Hund x = neuer Hund (), Katze y = neue Katze (), Boom keine mögliche Mehrdeutigkeit mehr.Animal
an Methoden zu übergeben, dieDog
und annehmenCat
. Polymorphismus ist das Gegenteil: so dass Sie Objekte vom Typ passieren kannDog
undCat
in einem Verfahren , das dauertAnimal
, zum Beispielvoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
Meiner Ansicht nach
var
sollte nur verwendet werden, wenn sofort klar ist, um welchen Typ es sich bei der Definition des Werts der Variablen handelt.Beispiel:
Es ist offensichtlich, dass
s
astring
.Ich halte es auch für angebracht, wenn der Variablentypname sehr komplex ist.
Beispiel:
Abgesehen von diesen Szenarien sehe ich keinen Gewinn, der durch die Verwendung erzielt werden
var
kann, aber ich kann mir einige Szenarien vorstellen, in denen dies nachteilig sein kann:Zum Beispiel ein Einweg-Typ, dessen rechter Variablenwert den Typ nicht klar anzeigt. Die Entsorgung des IDisposable kann leicht vergessen werden
Beispiel:
quelle
'var' fügt Ihrem Code eine Art "dynamisches" Element hinzu (obwohl der Code natürlich streng typisiert bleibt). Ich rate davon ab, es in Fällen zu verwenden, in denen der Typ nicht klar ist. Betrachten Sie dieses Beispiel:
Sollte der Rückgabetyp von GetTheObjectFromDatabase () von Typ A nach B geändert werden, werden wir dies nicht bemerken, da beide Klassen DoSomething () implementieren. Der Code kann jetzt jedoch tatsächlich etwas völlig anderes tun.
Dies kann so subtil sein, als würden beide verschiedene Dinge in ein Protokoll schreiben, sodass Sie möglicherweise nicht bemerken, dass es zu spät ist.
Die folgende Verwendung von var sollte immer in Ordnung sein:
quelle
Für diejenigen, die die ständige Verwendung von "var" nicht mögen, können Sie ReSharper auch daran hindern, standardmäßig var zu verwenden, wenn Sie "Variable einführen" ausführen. Dies war etwas, das mich lange Zeit frustrierte, es war immer standardmäßig var und ich änderte es jedes Mal.
Diese Einstellungen finden Sie unter Codebearbeitung> C #> Codestil
quelle
Es gibt keinen technischen Unterschied (wie eWolf hervorhob). Sie können den einen oder anderen verwenden, der generierte CLR-Code sieht gleich aus.
Meiner Meinung nach besteht der Hauptvorteil darin, dass Sie dazu gezwungen werden, bessere Variablennamen zu verwenden. In Ihrem Beispiel ist 'foo' eine ziemlich schlechte Wahl für einen Variablennamen.
quelle
Laut JetBrains (dem Autor von ReSharper) empfehlen sie standardmäßig die Verwendung von var.
Von ihrer Website :
quelle