Was sind die Hauptunterschiede zwischen C # und Java?

209

Ich möchte nur eines klarstellen. Dies ist keine Frage, bei der es besser ist, diesen Teil überlasse ich jemand anderem, um darüber zu diskutieren. Es interessiert mich nicht. Diese Frage wurde mir in meinem Vorstellungsgespräch gestellt und ich dachte, es könnte nützlich sein, ein bisschen mehr zu lernen.

Dies sind die, die ich mir einfallen lassen könnte:

  • Java ist "plattformunabhängig". Nun, heutzutage könnte man sagen, dass es das Mono- Projekt gibt, also könnte auch C # in Betracht gezogen werden, aber ich glaube, es ist ein bisschen übertrieben. Warum? Nun, wenn eine neue Version von Java fertig ist, ist sie gleichzeitig auf allen unterstützten Plattformen verfügbar. Wie viele Funktionen von C # 3.0 fehlen jedoch noch in der Mono-Implementierung? Oder ist es wirklich CLR vs. JRE , die wir hier vergleichen sollten?
  • Java unterstützt keine Ereignisse und Delegaten. Soweit ich weiss.
  • In Java sind alle Methoden virtuell
  • Entwicklungswerkzeuge: Ich glaube, es gibt noch kein solches Werkzeug wie Visual Studio. Besonders wenn Sie mit Teameditionen gearbeitet haben, wissen Sie, was ich meine.

Bitte fügen Sie andere hinzu, die Sie für relevant halten.

Update: Ich bin gerade auf den Gedanken gekommen, Java hat keine benutzerdefinierten Attribute für Klassen, Methoden usw. Oder doch?

Enes
quelle
1
Sprachen unterscheiden sich von Sprachimplementierungen, die sich auch von Bibliotheken unterscheiden. Was versuchst du zu vergleichen?
Miguel Ping
2
Ich habe dieses gefunden msdn.microsoft.com/en-us/library/ms836794.aspx Es behandelt sowohl die Ähnlichkeit als auch den Unterschied zwischen C # und Java.
Bipul
1
Mit den richtigen Bibliotheken können Sie viele der unten genannten Dinge über Java erhalten. Überprüfen Sie zum Beispiel diesen gültigen Java-Code: new String [] {"james", "john", "john", "eddie"} .where (StartsWith ("j")). Different (); Es verwendet eine Bibliothek namens lombok-pg. Kann unter github.com/nicholas22/jpropel
NT_

Antworten:

329

Vergleich von Java 7 und C # 3

(Einige Funktionen von Java 7 werden hier nicht erwähnt, aber der usingAnweisungsvorteil aller Versionen von C # gegenüber Java 1-6 wurde entfernt.)

Nicht alle Ihre Zusammenfassungen sind korrekt:

  • In Java sind Methoden standardmäßig virtuell, aber Sie können sie endgültig machen. (In C # sind sie standardmäßig versiegelt, aber Sie können sie virtuell machen.)
  • Es gibt viele IDEs für Java, sowohl kostenlos (z. B. Eclipse, Netbeans) als auch kommerziell (z. B. IntelliJ IDEA).

Darüber hinaus (und was steht bereits in Ihrer Zusammenfassung):

  • Generika sind zwischen den beiden völlig unterschiedlich; Java-Generika sind nur ein "Trick" zur Kompilierungszeit (aber ein nützlicher dazu). In C # und .NET werden Generika auch zur Ausführungszeit verwaltet und arbeiten sowohl für Werttypen als auch für Referenztypen, wobei die entsprechende Effizienz beibehalten wird (z. B. List<byte>als byte[]Hintergrund und nicht als Array von Boxbytes).
  • C # hat keine Ausnahmen überprüft
  • Java erlaubt nicht die Erstellung von benutzerdefinierten Werttypen
  • Java hat keine Überladung von Operatoren und Konvertierungen
  • Java hat keine Iteratorblöcke für die einfache Implementierung von Iteratoren
  • Java hat nichts wie LINQ
  • Zum Teil, weil es keine Delegaten gibt, hat Java nichts Vergleichbares wie anonyme Methoden und Lambda-Ausdrücke. Anonyme innere Klassen füllen normalerweise diese Rollen, aber klobig.
  • Java hat keine Ausdrucksbäume
  • C # hat keine anonymen inneren Klassen
  • C # hat überhaupt keine inneren Klassen von Java - alle verschachtelten Klassen in C # sind wie die statischen verschachtelten Klassen von Java
  • Java nicht statische Klassen haben (die keine haben keine , Instanzkonstruktoren und nicht für Variablen verwendet werden können, Parameter usw.)
  • Java hat keine Entsprechung zu den anonymen C # 3.0-Typen
  • Java hat keine implizit typisierten lokalen Variablen
  • Java hat keine Erweiterungsmethoden
  • Java hat keine Objekt- und Sammlungsinitialisiererausdrücke
  • Die Zugriffsmodifikatoren sind etwas anders - in Java gibt es (derzeit) kein direktes Äquivalent zu einer Assembly, also keine Vorstellung von "interner" Sichtbarkeit; In C # gibt es kein Äquivalent zur "Standard" -Sichtbarkeit in Java, die den Namespace (und die Vererbung) berücksichtigt.
  • Die Reihenfolge der Initialisierung in Java und C # ist geringfügig unterschiedlich (C # führt Variableninitialisierer vor dem verketteten Aufruf des Konstruktors des Basistyps aus).
  • Java hat keine Eigenschaften als Teil der Sprache. Sie sind eine Konvention von get / set / is-Methoden
  • Java hat nicht das Äquivalent von "unsicherem" Code
  • Interop ist in C # (und .NET im Allgemeinen) einfacher als Javis JNI
  • Java und C # haben etwas unterschiedliche Vorstellungen von Aufzählungen. Java ist viel objektorientierter.
  • Java hat keine Präprozessor-Direktiven (#define, #if usw. in C #).
  • Java hat kein Äquivalent zu C # refund outzum Übergeben von Parametern als Referenz
  • Java hat kein Äquivalent zu Teiltypen
  • C # -Schnittstellen können keine Felder deklarieren
  • Java hat keine vorzeichenlosen Ganzzahltypen
  • Java unterstützt keine Sprache für einen Dezimaltyp. (java.math.BigDecimal bietet so etwas wie System.Decimal - mit Unterschieden - aber es gibt keine Sprachunterstützung)
  • Java hat kein Äquivalent zu nullbaren Werttypen
  • Beim Boxen in Java werden vordefinierte (aber "normale") Referenztypen mit bestimmten Operationen verwendet. Das Boxen in C # und .NET ist eine transparentere Angelegenheit, bei der ein Referenztyp für das Boxen von der CLR für jeden Werttyp erstellt wird.

Dies ist nicht erschöpfend, deckt aber alles ab, was ich mir vorstellen kann.

Jon Skeet
quelle
24
@Brian: Ich denke, dass Java-Generika und die Details der inneren Klassen die Idee, dass Java durch Einfachheit Überlegenheit erlangt, ziemlich schnell zunichte machen;)
Jon Skeet
8
@OrangeDog: Leute, die sich streiten, machen meistens Witze, IMO. Es ist schwer zu erkennen, dass die Verpflichtung, einen expliziten try / finally-Block zu schreiben, weniger fehleranfällig ist als eine using-Anweisung, IMO. Die meisten der "zusätzlichen" Funktionen von C # im Vergleich zu Java bedeuten, dass Sie weniger Code schreiben müssen und dass dieser Code besser lesbar ist.
Jon Skeet
17
@OrangeDog: Wie unparteiisch bist du aus Interesse? Ja, ich bin ein C # -Enthusiast, aber mit ziemlich bedeutender Java-Erfahrung - es ist schließlich mein Tagesjob. Es ist nicht so, dass ich nicht weiß, wie man Java effektiv einsetzt.
Jon Skeet
8
@OrangeDog: Zunächst einmal schreiben die meisten Entwickler meines Wissens keinen Code mit "unsicher", also ist das ein roter Hering. Ich denke auch, dass Beweisbarkeit ein roter Hering ist - ich denke nicht, dass formale Beweisbarkeit sehr viel damit zu tun hat, wie einfach es für einen Menschen ist , über Code nachzudenken . Mein Punkt ist, dass ich als jemand, der sowohl in Java als auch in C # ziemlich erfahren ist, C # als eine weit überlegene Sprache in Bezug auf Produktivität und Lesbarkeit empfinde. Wenn Sie das Gegenteil empfinden, können Sie Ihre Erfahrung in beiden Sprachen klären? Ich denke, es ist ziemlich relevant für die Diskussion.
Jon Skeet
21
@OrangeDog: Darüber hinaus ist Ihre Behauptung, dass "in der Lage zu sein, mehr Dinge zu tun, die Wahrscheinlichkeit erhöht, dass Sie sie falsch machen", auch ein Trugschluss, IMO ... weil davon ausgegangen wird, dass Sie etwas nicht mit einer Funktion des tun können Sprache, die es einfach macht, müssen Sie es überhaupt nicht tun. Das ist einfach falsch - oft sind die Aufgaben, die Sie in Java und C # ausführen müssen, dieselben, aber aufgrund fehlender Funktionen macht es Java schwieriger, diese Aufgaben korrekt auszuführen. Durch die Vereinfachung der Aufgabe verringert die Funktion die Wahrscheinlichkeit, dass Sie etwas falsch machen.
Jon Skeet
24

Das Folgende ist eine ausführliche Referenz von Dare Obasanjo zu den Unterschieden zwischen C # und Java. Ich beziehe mich immer auf diesen Artikel, wenn ich zwischen den beiden wechsle.

http://www.25hoursaday.com/CsharpVsJava.html

Winston Smith
quelle
2
@ Jon Skeet: Sie sind der aktivste C # -Entwickler. Warum pflegen Sie nicht Ihre Version von C # - und Java-Unterschieden? Ich wette, die Leute würden es gerne lesen.
Krallen
1
@claws: Ich habe keine Zeit, alles zu tun, was ich möchte.
Jon Skeet
19
@ Winston: Wir brauchen eine "Unterschiede zwischen Chuck Norris und Jon Skeet" -Liste: 1) Chuck Norris hat immer Zeit; Jon muss die TimeDateKlasse ändern , um immer Zeit zu haben, und hatte noch keine Zeit dafür :(
RedFilter
11

C # verfügt über automatische Eigenschaften, die unglaublich praktisch sind und auch dazu beitragen, Ihren Code sauberer zu halten, zumindest wenn Ihre Getter und Setter keine benutzerdefinierte Logik enthalten.

Morten Christiansen
quelle
10

Funktionen von C # in Java nicht vorhanden • C # enthält primitivere Typen und die Funktionalität zum Abfangen von arithmetischen Ausnahmen.

• Enthält eine große Anzahl von Notationskomfort über Java, von denen viele, wie das Überladen von Operatoren und benutzerdefinierte Casts, der großen Community von C ++ - Programmierern bereits bekannt sind.

• Die Ereignisbehandlung ist ein "erstklassiger Bürger" - sie ist Teil der Sprache selbst.

• Ermöglicht die Definition von "Strukturen", die Klassen ähneln, aber auf dem Stapel zugewiesen werden können (im Gegensatz zu Instanzen von Klassen in C # und Java).

• C # implementiert Eigenschaften als Teil der Sprachsyntax.

• Mit C # können switch-Anweisungen mit Zeichenfolgen arbeiten.

• C # ermöglicht anonyme Methoden, die Schließfunktionen bereitstellen.

• C # ermöglicht einen Iterator, der Co-Routinen über ein Yield-Schlüsselwort im funktionalen Stil verwendet.

• C # unterstützt Ausgabeparameter und unterstützt die Rückgabe mehrerer Werte, eine Funktion, die von C ++ und SQL gemeinsam genutzt wird.

• C # kann Namespaces aliasen.

• C # verfügt über "Explicit Member Implementation", mit der eine Klasse Methoden einer Schnittstelle spezifisch implementieren kann, die von ihren eigenen Klassenmethoden getrennt sind. Dies ermöglicht es auch, zwei verschiedene Schnittstellen zu implementieren, die zufällig eine Methode mit demselben Namen haben. Die Methoden einer Schnittstelle müssen nicht öffentlich sein. Sie können nur über diese Schnittstelle zugänglich gemacht werden.

• C # ermöglicht die Integration mit COM.

• Nach dem Beispiel von C und C ++ ermöglicht C # den Aufruf als Referenz für Grund- und Referenztypen.

Funktionen von Java in C # nicht vorhanden

• Das Java-Schlüsselwort strictfp garantiert, dass das Ergebnis von Gleitkommaoperationen plattformübergreifend gleich bleibt.

• Java unterstützt geprüfte Ausnahmen zur besseren Durchsetzung der Fehlerbehebung und -behandlung.

Abhishek Kumar
quelle
9

Eine weitere gute Ressource ist http://www.javacamp.org/javavscsharp/. Diese Website enthält viele Beispiele, die fast alle Unterschiede zwischen diesen beiden Programmiersprachen veranschaulichen.

Über die Attribute verfügt Java über Anmerkungen, die fast genauso funktionieren.

Rafael Romão
quelle
5

Generika:

Mit Java-Generika erhalten Sie nicht die Ausführungseffizienz, die Sie mit .NET erzielen, da der Compiler beim Kompilieren einer generischen Klasse in Java den Typparameter entfernt und Object überall ersetzt. Wenn Sie beispielsweise eine Foo<T>Klasse haben, generiert der Java-Compiler Bytecode so, als ob dies der Fall wäre Foo<Object>. Dies bedeutet, dass das Casting und auch das Boxen / Unboxen im "Hintergrund" erfolgen müssen.

Ich spiele jetzt schon eine Weile mit Java / C # und meiner Meinung nach sind die Hauptunterschiede auf Sprachebene, wie Sie betont haben, Delegierte.

bruno conde
quelle
Dies ist falsch. Das Löschen oder erneute Löschen von Generika (Java bzw. C #) wirkt sich nicht unbedingt auf die Leistung aus.
Miguel Ping
Sie verwechseln Autoboxing mit Casting.
JesperE
3
Nein, Bruno hat Recht mit dem Leistungsunterschied. Es gibt keine Möglichkeit, das Äquivalent einer Liste <Byte> (allgemein) in Java zu erhalten. Sie müssten eine Liste <Byte> haben, die Boxstrafen (Zeit und Speicher) nach sich ziehen würde.
Jon Skeet
Das (Un-) Boxen findet nur für Box-Typen statt, die primitive Typen sind.
Miguel Ping
1
Bitte lesen
bruno conde
0

Bitte gehen Sie über den unten angegebenen Link msdn.microsoft.com/en-us/library/ms836794.aspx. Er behandelt sowohl die Ähnlichkeit als auch den Unterschied zwischen C # und Java

Kanwar Singh
quelle