Warum hat C # viel mehr Funktionen als Java? [geschlossen]

14

Bitte beachten Sie, dass dies kein Java vs. C # -Argument ist. Ich bin ein Java-Programmierer ohne C # -Erfahrung, der nur aus Neugier fragt.

Ich habe etwas über C # gelesen und es scheint, dass es viel mehr Funktionen als Java hat. Einige Beispiele:

  • Inferenz eingeben.
  • dynamic Stichwort.
  • Delegierte.
  • Optionale Parameter.
  • Lambda und LINQ (ich habe eigentlich keine Ahnung, was das sind).
  • Eigenschaften.

Java bietet jedoch nichts, was C # nicht bietet.

Meine Frage ist: Warum hat C # wesentlich mehr native Funktionen als Java? Und warum hat Java im Laufe der Jahre einige davon nicht hinzugefügt, zum Beispiel Eigenschaften oder Typinferenz? Gehen die Java-Sprachdesigner simpler vor? Was ist der Grund dafür?

Aviv Cohn
quelle
2
@Patrick - Ist das ein Feature - oder ein Implementierungsdetail?
Pete
14
Voreingenommene Antwort: Weil das C # -Designteam weiß, was sie tun. Vernünftigere Antwort: C # wurde mit der Kenntnis von Javas Fehlern und ohne das dogmatische "nur reine OO" (das sie nicht einmal ganz getroffen haben) entwickelt. Die Hälfte dieser Features wurde als Massenimport aus Lisp und Haskell importiert, zwei Sprachen, von denen Java sich bis Java 8 unbeirrt nicht inspirieren ließ.
Phoshi
4
Denn C # kam später und war anfangs eine krasse Abzocke von Java, und hatte dann die Möglichkeit, alles, was sich als lohnenswert herausstellte, zusätzlich hinzuzufügen, während Java durch sehr strenge Abwärtskompatibilitätsziele behindert wurde.
Kilian Foth
2
@ Clockwork-Muse, aber C # hat zwei Laufzeitimplementierungen - CLR und Mono. Auch da ist Xamarin. Ich habe noch keine einzige Lösung für das Erstellen von iOS / Android / WinPhone-Projekten mit Java kennengelernt.
Den
4
@KilianFoth: Eigentlich war C # ursprünglich eine Abzocke von Delphi , umgeschrieben, um wie Java auszusehen. Microsoft hat sogar den Delphi-Projektarchitekten von Borland abgeworben, um es zu erstellen.
Mason Wheeler

Antworten:

22

Mehrere Gründe:

  1. C # kam später als Java; Version 1 war eine krasse Abzocke von Java 1.4, also hatte es so ziemlich alles, was Java zu diesem Zeitpunkt hatte.
  2. Aber dann entwickelte sich C # viel schneller als Java, weil es eine aufregende neue Plattform war (und mit Anders Hejlsberg, dem Vater von Turbo Pascal, einen überaus brillanten Treiber hatte). Dadurch konnten sie alle offensichtlichen Fehler in Java vermeiden und alles hinzufügen, was die Java-Praktizierenden sich gewünscht hatten.
  3. In der Zwischenzeit wurde Java durch sehr strenge Abwärtskompatibilitätsziele und ein etwas langsameres Entwicklungstempo behindert, unter anderem, weil es verzweifelt versuchte, sich den Ruf zu verschaffen, die standardmäßige, unternehmerische, zuverlässige und nicht überraschende Lösung für 95% der Nicht-Genies zu sein Programmierer. Dies gelang ihnen vielleicht etwas zu gut.

Das Ergebnis ist, dass Java jetzt eine gewisse Funktionslücke aufweist. Es hat große Pläne für die Zukunft, aber wie immer dauert alles ein bisschen länger als geplant.

Kilian Foth
quelle
7
Ich bin mir nicht sicher, ob ich damit einverstanden bin. Ich meine, es ist alles wahr, aber ich vermute, dass der Grund mehr mit der Politik um den Zusammenbruch der Sonne zu tun hat. Java hatte im Grunde mehr als 5 Jahre, in denen es keine Organisation / Führung gab - es gab also keine neuen Funktionen.
Telastyn
7
C # 1 hatte Werttypen. Etwas, das Java niemals haben wird. Also nicht nur eine "krasse Abzocke".
Den
1
@ Telastyn - Ich denke, das ist der wichtigste Grund hier. Vor allem, wenn Sie hinzufügen "und dann werden Sie von Orakel" bis zum Ende des Zusammenbruchs der Sonne erworben.
Wyatt Barnett
7
Stimmen Sie mit @Den überein. Ich denke, der Hauptgrund dafür, dass sich C # schneller (und in die richtige Richtung) entwickelt, ist die Führung von Anders Hejlsberg. Er und sein Team haben die besten Funktionen aus anderen Sprachen hinzugefügt und es geschafft, sie nahtlos in C # zu integrieren. Das Ergebnis ist, dass C # sehr übersichtliche Sprachfunktionen bietet, ohne sich überladen oder chaotisch zu fühlen.
David Kirkland
1
@WesleyWiser - Upgrade auf "Möglicherweise in Zukunft".
Den
4

Ich möchte Kilians Antwort hinzufügen, dass ein großer Unterschied zwischen Java und C # darin besteht, dass C # -Designer nicht nur die Sprache, sondern auch die Standard-IDE steuern.

Das Hinzufügen von Erweiterungsmethoden und Teilklassen kann ein Albtraum bei der Versionsverwaltung sein, wenn die IDEs dies nicht ordnungsgemäß unterstützen.

Da erwartet wird, dass Sie Java mit der Plattform Ihrer Wahl (Eclipse, Netbeans, vi + Ant) kompilieren können, ist das Hinzufügen von Funktionen, die den Code beschädigen (und das Entwickeln zusätzlicher Erweiterungen wie LINQ), weitaus komplizierter als " Da IntelliSense sich mit diesen Fällen befasst, müssen wir uns keine Sorgen machen. "

Manchmal lohnt es sich auch, den Wert der Features anstelle der Anzahl zu notieren. Zum Beispiel sind automatische Eigenschaften nett und ich wünsche mir auf jeden Fall, dass Java dies unterstützt, aber am Ende bedeutet dies nur, dass Sie noch ein paar Codezeilen in Java schreiben müssen. In ähnlicher Weise empfinde ich das Aufrufen von "Events" als eine Art Fehlbezeichnung, da es sich nur um speziell gekennzeichnete Stellvertreter handelt und nur um eine verfeinerte Kopie des Observer-Musters, das bereits von Java verwendet wird (in Java ist dies wiederum expliziter erforderlich) Kodierung)

Verstehen Sie mich nicht falsch, ich denke, C # hat einige bemerkenswerte Neuerungen eingeführt, und ich wünsche mir, dass eines Tages große Oracle-Bosse aufwachen und ein echtes "Java 2" starten, um einige davon einzuschließen, aber die Lücke ist nicht so offensichtlich wie Ihre Fragenpunkte.

SJuan76
quelle
2
Die neun Zeilen, die für eine einfache Eigenschaftsdefinition benötigt werden (Deklaration + get / set + Leerraum), summieren sich schnell zu mehr als "ein paar".
Kevin Cline
@ Kevincline und ich dokumentieren auch richtig sowohl Setter als auch Getter. Aber am Ende, auch wenn ich nicht meine automatische IDE - Codegenerierung für den Accessor verwende, verwende ich damit keine nennenswerte Zeit, wenn Sie die Zeit berücksichtigen, die Sie für Geschäftslogik, Testen, Codedesign (in der Tat) aufgewendet haben Ich denke meistens darüber nach, auch wenn ich die Accessoren schreibe. Also, obwohl nett, ist es nicht etwas, das am Ende einen großen Unterschied macht ...
SJuan76
3
Es ist nicht die Zeit, sie zu schreiben. Es ist an der Zeit, sie immer und immer wieder zu lesen und zu ignorieren, während Sie sich auf den Weg zu den interessanten Teilen machen.
Kevin Cline
@ Kevincline Ich stimme zu, es ist absolut lesbar und der Code ist sauber. Aus diesem Grund schätze ich Dinge wie Ereignisse, die nur ein eingebautes Beobachtermuster sind, aber mache die Dinge viel sauberer, wenn Sie diese selbst schreiben müssten
Aviv Cohn
@AvivCohn Die Sache ist, "eingebaut" ist der Schlüsselteil. Sie können dynamische Versendung in der Baugruppe haben, Sie können Funktionen höherer Ordnung in C haben, jede einzelne Sprachfunktion, die Sie haben können, ist in der Baugruppe möglich - offensichtlich, da sie irgendwann immer noch auf Ihrer x86-CPU ausgeführt wird. Sie müssen das Befehlsmuster selten in C # implementieren, da Sie über Stellvertreter verfügen. Das gleiche gilt für Observer und Events und viele andere. Java hatte einige Zeit anonyme Methoden, aber Sie mussten einen ganzen anonymen Typ erstellen . All diese Dinge sind winzig, aber sie summieren sich.
Luaan