Frage

Die var Stichwort beseitigt die Notwendigkeit für eine explizite weg Typdeklaration, und ich habe mit Interesse der SO Diskussion lesen, wenn es auch sein mag angemessen ist.

Ich habe auch über (aber nicht verwendet) lesen Boo , die Dinge zu nehmen scheint ein Schritt weiter, indem sie optional machen eine lokale Variable zu erklären. Mit Boo, sowohl die Art und die Erklärung können impliziert werden.

Was mich führt zu fragen, warum die Sprache C # Designer stören überhaupt ein Schlüsselwort var schließen?

Aktualisieren : Ja, var unterstützt Anonyme Typen, aber anonyme Typen selbst tun das Schlüsselwort var nicht erforderlich machen ...

var anon = new { Name = "Terry", Age = 34 };

Vergleich

anon = new { Name = "Terry", Age = 34 };
War es hilfreich?

Lösung

Update: Es gibt zwei Fragen hier, eigentlich: 1. Warum muss ich Variablen überhaupt erklären? 2. Was nützt „var“ in einer Sprache, die Sie Variablen deklarieren macht?

Die Antworten auf (1) sind zahlreich und können an anderer Stelle für diese Frage zu finden. Meine Antwort auf (2) unter:

Wie andere commen gesagt haben, LINQ verwendet diese für die anonyme Typen. Allerdings LINQ ist eigentlich eine Instanz eines allgemeineren Problems, wo die Art der rechten Seite eines Ausdrucks entweder unbekannt für den Programmierer ist, oder ist extrem ausführlich. Bedenken Sie:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

Ausführlich und fehleranfällig, nicht wahr? So, jetzt lassen sie dich tun:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

Durch die Vervielfältigung von Informationen zu reduzieren, werden Fehler beseitigt. Beachten Sie, dass es nicht nur Tippfehler, hier: Es ist für den Typ des linken Ausdruck möglich ist, so falsch eingegeben werden, dass der Compiler leise von links nach rechts werfen können, aber die Besetzung verliert tatsächlich eine Eigenschaft der rvalue. Dies ist umso wichtiger, wenn die Typen von dem R-Wert zurückgegeben können unbekannt oder anonym sein.

Andere Tipps

Ohne das Schlüsselwort var es möglich wird, versehentlich eine neue Variable zu erstellen, wenn Sie tatsächlich eine bereits vorhandene Variable zu verwenden beabsichtigt haben. z.

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name

Ich verstehe die Notwendigkeit var und es dient es dazu groß. kein Keyword hat und nur Variablen im laufenden Betrieb ohne Typen definiert, ist beängstigend. Ihre verletzen den nächsten Mann, der Ihren Code erhalten hat oder selbst wenn Sie den Code zu überarbeiten müssen Sie nicht berührt haben mehr als ein Jahr in. Ich bin nicht sicher, dass eine Tür, die in C # geöffnet werden soll, und ich hoffe, es ist nicht so var bereits Lesbarkeit Probleme verursachen, wenn sie über verwendet wird, wenn es nicht notwendig ist.

Fast .net jeder 3.5 Beispiel, das ich in letzter Zeit sehe alle Variablen hat mit var definiert.

Die arguement ich mache, ist, dass es wirklich Tastendrücke Lesbarkeit aus Gründen der Einsparung opfert, wenn es vorbei verwendet wird. Zum Beispiel:

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

Das Problem, das ich sehe, ist, dass die Menschen es überall verwenden ... zum Beispiel:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

Also das nächste Argument sein, nennt nur die Funktion besser ...

var weight = GetExactWeightOfTheBrownYakInKilograms();

Sie wissen immer noch nicht, was zurück kommt. Ist es ein int, dezimal, float, Gewicht Objekt, was? Ich habe immer noch Zeit verschwenden Suche it up ... müssen die Intellisense Krücke den Tag von meiner faul Programmierung zu speichern. Vielleicht ist der Rückgabetyp in den Funktionsnamen. Gute Idee, jetzt var hat uns gerettet nichts außer machen alle meine Funktionen haben echte langen Namen.

Ich glaube, die Leute nur über mit var sind und es zu faul Programmierung führt, was wiederum zu härteren führt Code zu lesen. Jedesmal, wenn man das Schlüsselwort var tippen, sollten Sie einen guten Grund, warum Sie es verwenden, anstatt explizit zu werden.

Dies ist ein wenig subjektiv, aber ich denke, die Gestaltung C # 3.0 die „var“ Schlüsselwort für implizit typisierte Variablen statt kein Schlüsselwort zu haben, macht den Code besser lesbar. Zum Beispiel ist der erste Codeblock unten besser lesbar als die zweiten:

Offensichtliche, wo die Variable deklariert:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

Nicht offensichtlich, wo die Variable deklariert ist:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

Diese sind über verein Beispiele. Ich denke, man kann sehen, wo das geht. In komplexen Situationen kann es schön sein, um den Ort zu finden, wo eine Variable tatsächlich definiert ist.

In Ihrer Frage, fügt var Wert auf den Code durch den Compiler zu sagen das Wort anon für den Einsatz jetzt legal ist überall würde man erwarten, dass ein Element des Typs in der Zuordnung implizierte zu sehen. Die Forderung an die Einführung von Namen an den Compiler wie dies ermöglicht es dem Compiler Dinge abzulehnen hat es nicht ausdrücklich gesagt, erlaubt sind, und dadurch bestimmte Arten von Fehlern bei der Kompilierung zu fangen, so dass sie während der Laufzeit nicht sprengen.

Zum Beispiel in dem Update-Abschnitt Ihrer Frage, Sie diesen Schnipsel gefragt:

anon = new { Name = "Terry", Age = 34 };

Das Problem es auf diese Weise mit ermöglicht ist, dass es irgendetwas auf der linken Seite einer beliebigen Zuordnung dreht, wo der Name in einer Variablendeklaration vorher nicht vorhanden waren, auch wenn es ein wirklich ein Tippfehler ist. Wenn später im Programm Ihnen etwas anderes zu Anon zuweisen und dann noch weiter auf Referenz den neuen Wertes, aber die Mitte Aussage hatte einen Tippfehler, haben Sie ein Problem, das erst zur Laufzeit bis zeigen.

Ihre Antwort ist, dass Boo es tut, so muss es in Ordnung oder zumindest möglich sein. Aber das ist eine falsche Fährte. Wir reden über C #, nicht Boo. Eines der Ziele von C # ist eine Sprache zu haben, wo der Compiler so viele Fehler wie möglich zu fangen. Boo will das auch tun, aber es will auch mehr wie Python sein. So opfert es einig (nicht alle) von C # 's Kompilierung-Sicherheit im Austausch für Python-ähnliche Syntax.

Disclaimer:. Meine Beispiele Java sind, denn das ist, was ich weiß, aber die Konzepte sollten identisch sein

stimmte ich die Antwort, die ich kritisch fühlen ist (es ist zu leicht versehentlich eine neue Variable erstellen).

bill=5;
bi11=bill+5

Was ist der Wert der Rechnung ist?

Das heißt, ich finde es etwas irritierend manchmal zu geben:

DataOutputStream ds=new DataOutputStream();

Es scheint überflüssig, aber ehrlich gesagt gibt es nichts wirklich falsch mit ihm. Es braucht Sie nicht länger es zweimal eingeben, und es ist sehr hilfreich. Was Zeit in Anspruch nimmt, wenn Sie Fragen haben - wenn Sie nicht sicher sind, wie einige API zu verwenden. Wenn es stört Sie wirklich zweimal diese Art Erklärung zu geben, warum dann sind Sie verschwenden Ihre Zeit hier? Da begann Sie dies lesen Sie 30 oder 40 Deklaration eingegeben haben könnte, genug für jede Erklärung Sie für die nächsten zwei Wochen benötigen.

Ich glaube, ich sage, dass, obwohl ich den emotionalen Stress zu verstehen, dass sich wiederholende selbst verursachen kann, die Konsistenz, Klarheit und die Fähigkeit intelligenter Tools macht es lohnt sich zu machen.

Eine weitere Sache, die meiste Zeit soll der Code nicht oben wie mein Beispiel. Was Sie tun sollten, ist dies:

DataOutput ds=new DataOutputStream();

Diese sofort verbirgt die Tatsache, dass Sie eine konkrete Klasse in eine Vorlage verwenden. Das Vorlage sollte alle Operationen tun können Sie auf Ihre Klasse benötigen. Später, wenn Sie mit einer anderen Art von Ausgangsstrom ersetzen ds wollen, einfach zu ändern, dass einzelne Zeile es beheben. Wenn Sie die Funktionen verwenden sind Dataoutput nicht verfügbar von zu Dataoutputstream Gießen, wird der Editor leicht herausfinden und Sie wissen lassen.

Für anonyme Typen, die unter anderem LINQ unterstützen.

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

Ich glaube, dass var (und einige andere neue Schlüsselwörter) speziell Linq zu unterstützen hinzugefügt wurden.

var ist das Schlüsselwort verwendet, um einen anonymen Typ zu schaffen - siehe http: / /msdn.microsoft.com/en-us/library/bb397696.aspx

Anonyme Typen können auch in anderen Orten als Linq verwendet werden.

var ist exceedingy nützlich für Linq. In der Tat, nach einem Experten-Autor, " Ohne 'var', LINQ wird zu schmerzhaft zu verwenden. "

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top