Einführung der Kürze in C # / Java

7

Hintergrund

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>();

Frage

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?

%Vor%

Folgefragen:

  1. Was sind mögliche Fallstricke dieses Ansatzes? Welche Randfälle könnte ich vermissen?
  2. Gäbe es andere Möglichkeiten, die Instanziierung zu verkürzen (ohne VB6-esque 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.

    
rick schott 08.04.2009, 13:36
quelle

15 Antworten

32

C # speichert am anderen Ende:

%Vor%     
Peter Lillevold 08.04.2009, 13:37
quelle
15
  

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 .

    
Eric Lippert 08.04.2009 16:00
quelle
13

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.

    
Jon Skeet 08.04.2009 13:38
quelle
5

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 .

    
Brian Agnew 08.04.2009 13:44
quelle
4

Ihre Version ist weniger lesbar, Entschuldigung.

Code soll von Menschen gelesen werden, nur gelegentlich von Maschinen.

    
Genericrich 08.04.2009 13:37
quelle
4

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.

    
Lucero 08.04.2009 13:43
quelle
2

C # hat:

%Vor%

was die gleiche Sache erreicht.

    
Douglas Leeder 08.04.2009 13:38
quelle
2

C # 3.0 hat einen Mechanismus, um die Duplizierung bei der Typisierung zu reduzieren, aber es geschieht, indem Sie vage über den Typ, den Sie deklarieren, aber explizit in dem Typ, den Sie konstruieren, machen:

z.B.

%Vor%     
Ray Hayes 08.04.2009 13:40
quelle
2

Ich stimme zu, dass das ein nettes Feature wäre. Ein besseres Beispiel wäre, wo noch mehr Eingabe benötigt wird:

%Vor%

Das Leben wäre einfacher, wenn auch nur geringfügig, wenn das instanziiert werden könnte als:

%Vor%

und:

%Vor%     
sipwiz 08.04.2009 13:42
quelle
2

In C # gibt es

%Vor%     
Rik 08.04.2009 13:38
quelle
0

in C #, Theres schon so etwas wie:

%Vor%     
mkoryak 08.04.2009 13:40
quelle
0

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.

    
Henning 08.04.2009 13:47
quelle
0

Java hat

%Vor%     
Peter Lawrey 09.04.2009 07:07
quelle
0

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

%Vor%

Lesbarkeit wird nur noch einmal gewinnen.

    
Valentin Kuzub 22.08.2011 13:34
quelle
0

Ich denke, Microsoft hat es so gemacht: a) var xy = new MyClass();

anstelle von diesem Weg: b) MyClass xy = new();

weil a) anonyme Klassen halten kann und das mit b) nicht möglich wäre.

    
gsharp 22.08.2011 13:56
quelle

Tags und Links