Zur Zeit, wenn ich ein new
Objekt in C # oder Java erstellen möchte, gebe ich etwas ein, das dem folgenden ähnelt:
List<int> listOfInts = new List<int>(); //C#
ArrayList<String> data = new ArrayList<String>(); //Java
C # 3.0 versuchte, die Prägnanz zu verbessern, indem der folgende Compiler-Trick implementiert wurde:
var listofInts = new List<int>();
Da der Compiler bereits weiß, dass ich ein neues Objekt eines bestimmten Typs erstellen möchte (durch die Tatsache, dass ich es instanziiere, ohne ihm eine null
-Referenz zuzuweisen oder eine bestimmte Methode zur Instantiierung zuzuweisen), dann warum kann ich Folgendes nicht tun?
var
zu verwenden) und behalten Sie trotzdem die Bedeutung? HINWEIS: Einer der Hauptvorteile, die ich in einem Feature wie diesem sehe, ist die Klarheit. Sagen wir, Var war nicht begrenzt. Für mich ist es nutzlos, es wird die Aufgabe von rechts bekommen, also warum? New () zu mir verkürzt es tatsächlich und gibt Bedeutung. Es ist ein neues () was auch immer du erklärt hast, was für mich klar und prägnant wäre.
Welche Randfälle könnte ich vermissen?
Ich habe diese mögliche C # -Syntax auf meiner kurz besprochen blog im Januar. Lesen Sie die Kommentare zu diesem Beitrag für einige Leser Feedback zu den Vor- und Nachteilen der Syntax.
Gäbe es andere Möglichkeiten, die Instanziierung zu verkürzen (ohne VB6-esque var zu verwenden) und behalten Sie trotzdem die Bedeutung?
Möglicherweise, ja.
"var" in C # ist jedoch nichts wie "Variante" in VB6. "var" bedeutet nicht dasselbe wie "object", noch führt es dynamisches Tippen oder Duck-Tippen ein. Es ist einfach ein syntaktischer Zucker für Beseitigung der überflüssigen Angabe des Typs der rechten Seite .
In C # 3 gibt es bereits das Spiegelbild für lokale Variablen, das implizit Folgendes eingibt:
%Vor%Diese funktioniert nicht für nicht-lokale Variablen obwohl.
In Java berücksichtigt Inferenz das Zuweisungsziel, also statische Importe und schlaue Bibliotheken wie das Google Java-Sammlungen können Sie Code schreiben wie:
%Vor%Beachten Sie, dass dies die Variable interface-basiert hält, während Sie die Implementierung auf der Konstruktionsseite angeben, was nett ist.
In den neuen Java-7-Vorschlägen gibt es einen Typ-Schlußvorschlag, der das Leben leichter machen wird. Generika-Deklarationen.
z.B.
%Vor%vs
%Vor%Weitere Informationen finden Sie hier .
Ihre Version ist weniger lesbar, Entschuldigung.
Code soll von Menschen gelesen werden, nur gelegentlich von Maschinen.
Wenn Sie objektorientierte Ansätze verwenden, erstellen Sie häufig mehr Instanzen eines spezifischeren Typs als Ihre Variable. Außerdem ist es oft eine gute Idee, einen weniger spezifischen Typ oder eine Schnittstelle zu verwenden. In diesen Fällen würde das keinen Sinn ergeben.
Denken Sie an Schnittstellen:
%Vor%Aus technischer Sicht enthält die Signatur einer Operation auch nicht den Rückgabetyp, so dass diese Art der Zuweisung sich vom normalen Fall völlig unterscheidet.
In Java ist das nicht sehr sinnvoll, da Sie normalerweise Variablen mit dem Interface-Typ deklarieren:
%Vor%Es wäre jedoch in den meisten Fällen sinnvoll, die Deklaration des generischen Typs ohne Compiler-Warnungen auslassen zu können, beispielsweise:
%Vor%Aber da Java immer sehr explizit und ausführlich über alles ist, könnte das genauso bleiben.
(Und warum würde jemand wieder C # oder Java ohne IDE programmieren?)
BEARBEITEN:
Oh, da gibt es einen Vorschlag dafür! Süss. Danke, Brian.
Code wird von links nach rechts gelesen (wenn Ihre Sprache nicht von rechts nach links ist).
Das bedeutet, dass
%Vor%setzt wichtige Daten in den richtigen Teil (tatsächlicher Methoden- / Typkonstruktor, der zum Initialisieren einer Variablen verwendet wird, aus dem ein Leser des Codes Wissen über tatsächlichen Var-Typ ableiten kann), was weniger praktisch ist zu sehen, verglichen mit, wenn es in der linken gelegen ist.
Was der Autor jedoch vorschlägt, ist viel besser für einen von links nach rechts lesenden Menschen - wir deklarieren eine Variable des bekannten Typs (nicht irgendein unbekannter Var-Typ)
%Vor%jetzt wichtige Daten (der tatsächliche Typ, den diese Variable haben wird) ist auf der linken Seite, wir können Code auf der linken Seite scannen und beachten Sie tatsächliche Typen, nicht einen Zaun von var Deklarationen
%Vor% Code Complete
book gibt an, dass Lesbarkeit am wichtigsten ist, und ich finde es schwierig, dem nicht zuzustimmen. Das Speichern von 5 (oder weniger) Sekunden und die Verwendung von var
anstelle von reellem Typ macht die Code-Überprüfung in Zukunft schwieriger, kann den Code abhängig vom richtigen Teil unlesbar machen und unerwartete Fehler erzeugen, die sehr schwer zu bemerken sind. Alles mit dem Wert von .. 5 Sekunden speichern und nicht einen Deklarationstyp für Variable schreiben?
Es ist mittlerweile allgemein bekannt, dass das tatsächliche Code-Schreiben nicht so viel Zeit in Anspruch nimmt, die für die Erstellung von Programmen benötigt wird, insbesondere wenn es sich um ein Produkt Programm handelt. (in der Regel Debugging, Systemtests, Komponentenintegration, Design, Meetings, etc. VIEL mehr Zeit, dass das eigentliche Schreiben von Code)
Andererseits, wenn wir
eingeben %Vor%Ich finde es schwierig, diese Zeile nicht anders zu interpretieren, als einen Standardkonstruktor für den Typ aufzurufen und eine Instanz des Typs zu erstellen.
Auch im Falle einer Wand von Initialisierungen erhalten wir am Anfang der Zeile tatsächliche Typnamen, so dass der Code von oben nach unten leicht zu scannen ist und wir die Augen nicht bis zum Ende der Zeichenkette bewegen müssen, um zu wissen, was tatsächlich ist Diese konkrete Var-Initialisierung tut das. (Und wenn Sie denken, Zeile bis Ende zu scannen ist eine freie Roll-Aufgabe, vor allem nicht, und mit Var nicht nur Scannen, es überprüft auch, ob es einen Fehler im richtigen Teil der Initialisierung ( Zum Beispiel wird eine Methode mit einem anderen Rückgabetyp aufgerufen oder einige andere Arten von Fehlern, die var erlaubt))
%Vor% Ich bin gegen var
use, außer für Fälle, für die es erstellt wurde (anonyme Typen, die normalerweise von LINQ kommen), und wenn wir etwas Platz in einem Code einsparen würden, würde ich bevorzugen, dass irgendwelche Code reduzierenden Strategien auf der rechte Seite.
Ich glaube auch, dass die Verwendung von var
, um eine Variable zu deklarieren und sie einem Rückgabewert einer Methode zuzuordnen, die Codeanalyse sehr kompliziert macht und oft schwer zu fangende Fehler verursacht, die vollständig vermieden worden wären, wenn var nicht möglich wäre solche Fälle, wenn also nur der Konstruktor-Code zu einem new()
oder new(ParamType param)
verkürzt werden könnte und nicht irgendeine andere Methode wie
Lesbarkeit wird nur noch einmal gewinnen.