Gibt es für C # -Entwickler, die Java lernen möchten, große Unterschiede zwischen den beiden Sprachen, auf die hingewiesen werden sollte?
Vielleicht nehmen einige Leute an, dass die Dinge gleich sind, aber es gibt einige wichtige Aspekte, die nicht übersehen werden sollten? (oder du kannst es wirklich vermasseln!)
Möglicherweise in Bezug auf OOP-Konstrukte, die Funktionsweise von GC, Referenzen, Bereitstellungsinformationen usw.
Antworten:
Ein paar Fallstricke von meinem Kopf:
byte
ist in Java signiert (leider)static
wird es einen impliziten Verweis auf eine Instanz der Klasse enthalten hat.quelle
Hier ist ein sehr umfassender Vergleich der beiden Sprachen:
http://www.25hoursaday.com/CsharpVsJava.html
Hinzugefügt: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
quelle
Ich bin überrascht, dass niemand Eigenschaften erwähnt hat, was in C # ziemlich grundlegend ist, in Java jedoch fehlt. C # 3 und höher hat ebenfalls automatisch Eigenschaften implementiert. In Java müssen Sie GetX / SetX-Typmethoden verwenden.
Ein weiterer offensichtlicher Unterschied sind LINQ- und Lambda-Ausdrücke in C # 3, die in Java fehlen.
Es gibt ein paar andere einfache, aber nützliche Dinge, die in Java fehlen, wie wörtliche Zeichenfolgen (@ ""), Überladen von Operatoren, Iteratoren, die Yield verwenden, und Pre-Prozessor, die auch in Java fehlen.
Einer meiner persönlichen Favoriten in C # ist, dass Namespace-Namen nicht der physischen Verzeichnisstruktur folgen müssen. Diese Flexibilität gefällt mir sehr gut.
quelle
Es gibt viele Unterschiede, aber diese fallen mir ein:
quelle
.equals
ist das, was Sie verwenden müssen..NET hat Generika reifiziert. Java hat Generika gelöscht.
Der Unterschied besteht darin, dass Sie
ArrayList<String>
in .NET (zur Laufzeit) feststellen können, dass das Objekt vom Typ istArrayList<String>
, während in Java zur Laufzeit das Objekt vom Typ istArrayList
. DasString
Teil ist verloren. Wenn Sie Nicht-String
Objekte in das Objekt einfügenArrayList
, kann das System dies nicht erzwingen, und Sie werden es erst erfahren, nachdem Sie versucht haben, das Objekt herauszuziehen, und die Besetzung schlägt fehl.quelle
String
Objekte in diese Liste aufnehmen können, ohne irgendwo eine ungeprüfte Umwandlung vorzunehmen , und der Compiler Sie an dieser Stelle korrekt warnt, dass der Compiler die generischen Grenzen nicht mehr überprüfen kann. Solange Ihre Liste immer in einer Variablen von gespeichert istList<String>
, werden Versuche, ein Nicht-String-Objekt einzufügen, nicht kompiliert.add
Methode auf (erneut über Reflexion). Wird das System ein Nicht-String
Objekt sofort ablehnen oder nur, wenn das Ergebnis vonget
gewirkt wird?List
. Sie können Objekte von Typen haben, die vonList
, wieArrayList
und absteigenLinkedList
. (Es ist wichtig zu verwenden,List
anstattArrayList
sienew List()
Eine Sache, die ich in C # von Java vermisse, ist die erzwungene Behandlung geprüfter Ausnahmen. In C # ist es weit verbreitet, dass man sich der Ausnahmen, die eine Methode auslösen kann, nicht bewusst ist und Sie der Dokumentation oder den Tests ausgeliefert sind, um sie zu entdecken. Nicht so in Java mit aktivierten Ausnahmen.
quelle
Java verfügt über Autoboxing für Grundelemente und nicht für Werttypen. Obwohl
System.Int32[]
es sich um ein Array von Werten in C # handelt,Integer[]
handelt es sich um ein Array von Verweisen aufInteger
Objekte und ist daher nicht für Berechnungen mit höherer Leistung geeignet.quelle
Keine Delegierten oder Ereignisse - Sie müssen Schnittstellen verwenden. Glücklicherweise können Sie Klassen und Schnittstellenimplementierungen inline erstellen, sodass dies keine große Sache ist
quelle
x => x.Foo
vs.new Bar() { public void M(SomeType x) { return x.Foo; } }
- wen interessiert es, dass der Code zehnmal kürzer ist?Die in Java integrierte Datums- / Kalenderfunktion ist im Vergleich zu System.DateTime schrecklich. Hier gibt es viele Informationen dazu: Was stimmt nicht mit der Java Date & Time API?
Einige davon können Fallstricke für einen C # -Entwickler sein:
Darüber hinaus verfügt Java nicht über dieselben Funktionen wie das GAC und stark benannte Assemblys. Jar Hell ist der Begriff für das, was beim Verknüpfen / Referenzieren externer Bibliotheken schief gehen kann.
In Bezug auf Verpackung / Bereitstellung:
quelle
In Java gibt es keine Delegierten. Abgesehen von all den Vorteilen, die Delegierte mitbringen, funktionieren Veranstaltungen daher auch anders. Anstatt nur eine Methode anzuschließen, müssen Sie eine Schnittstelle implementieren und diese stattdessen anhängen.
quelle
Eine Sache, die b / c auf meiner Interviewliste herausspringt, ist, dass es in Java kein "neues" Schlüsselwortanalogon zum Ausblenden von Methoden gibt und daher keine Compiler-Warnung "Sie sollten hier etwas Neues einfügen". Das versehentliche Ausblenden einer Methode, die Sie überschreiben wollten, führt zu Fehlern.
(zum Beispiel bearbeiten) Beispiel: B leitet sich von A ab (unter Verwendung der C # -Syntax verhält sich Java genauso, wie ich es zuletzt überprüft habe, gibt jedoch keine Compiler-Warnung aus). Wird A's Foo genannt oder B's Foo? (A wird aufgerufen, was wahrscheinlich den Entwickler überrascht, der B implementiert hat).
quelle
new
Methode zum absichtlichen Ausblenden - oder nicht endgültig, also überschrieben und nicht verborgen.Java hat kein LINQ und die Dokumentation ist die Hölle. Die Entwicklung von Benutzeroberflächen in Java ist schwierig. Sie verlieren alle guten Dinge, die Microsoft uns gegeben hat (WPF, WCF usw.), erhalten jedoch schwer zu verwendende, kaum dokumentierte "APIs".
quelle
Das einzige Problem, auf das ich bisher gestoßen bin, wenn ich mit Java aus C # arbeite, sind Ausnahmen und Fehler, die unterschiedlich sind.
Beispielsweise können Sie mit catch (Ausnahme e) keinen Speicherfehler abfangen.
Weitere Informationen finden Sie im Folgenden:
Warum-ist-Java-lang-outofmemoryerror-Java-Heap-Space-nicht-gefangen
quelle
Es ist so lange her, dass ich in Java war, aber die Dinge, die mir auf Anhieb bei der Anwendungsentwicklung aufgefallen sind, waren C # -Ereignismodell, C # Drag & Drop im Vergleich zur Verwendung von Layout-Managern in Swing (wenn Sie App-Entwickler sind) und Ausnahmebehandlung mit Java stellt sicher, dass Sie eine Ausnahme abfangen und C # nicht erforderlich ist.
quelle
Als Antwort auf Ihre sehr direkte Frage in Ihrem Titel:
"C # -Entwickler, die Java lernen, was sind die größten Unterschiede, die man übersehen kann?"
A: Die Tatsache, dass Java unter Windows erheblich langsamer ist.
quelle
Der größte Unterschied für mich, wenn ich zu Java wechsle, ist die String-Deklaration.
in C #
string
(meistens) in JavaString
Es ist ziemlich einfach, aber glauben Sie mir, es macht Sie so viel Zeit verlieren , wenn Sie die Gewohnheit haben ,
s
nichtS
!quelle