Java <-> C# Vergleich
-
Was mich persönlich auch begeistert hat bei der Programmierung in Java war der massive Einfluss von OpenSource Software. Man denke dabei nur an Ant, Maven, Spring, Struts, Hibernate, etc.. Allesamt Innovationen im Java Bereich, die erst nach und nach auch in der .NET Welt durch Portierungen verfügbar werden.
-
Wobei properties, delegates und events eigentlich nur nettes Beiwerk sind, genauso wie Operator-Überladung.
properties kann man durch getter/setter-Methoden ersetzen.
delegates und events durch Interfaces/abstrakte Klassen und halt Container-Klasse die diese verwalten.
So ein entscheidendes Kriterium ist es nicht, wenn man eine Sprache wählen kann/will.C# kann mehr und ist cooler
Das ist eine sehr komische Aussage. Ein Ziel von Java war es doch möglichest einfach zu sein. Java hat eben wenig Redundanz.
Ein Beispiel:
Struct/Class, wozu das unterscheiden? In Java hat man es gelassen und lebt auch glücklich damit.
properties sind halt nur getter/setter-Methoden, also hat man die in Java auch ausgelassen. Dafür gibt es in Eclipse die Option die getter/setter automatisch zu generieren.
Virtual/nicht virtual. Für den Anwender der Klasse ist es egal, also hat man in Java einfach alle Methoden per default virtual gemacht. Der Compiler kann dann ja entscheiden ob der overhead nötig ist.Ich frag mich grad nur eins, wieso wurde erst mit C#/net. 2.0 Generics eingeführt? Wieso nicht gleich in 1.0. Nun muss man beides Implementieren (Generic/nicht Generic), das ist mehr als lächerlich.
-
Die Sprachmittel machen es halt leichter. Bei properties muss ich keine Methoden suchen die get/set heißen und als Properties verstehen. Bei events muss ich halt dann nicht mehr schreiben
addKeyEventListener( new KeyEventListener() {
....
} )sondern schreibe form.KeyDown += myHandler.
Ist halt schöner und deshalb möchte ich nicht darauf verzichten. Auch structs haben ihren Sinn. Wenn etwas logisch einen Wert repräsentiert (zum Beispiel ein Datum), dann ist es auch toll, es als Wert zu behandeln. Manchmal ist dafür ein struct schöner, manchmal eine immutable class wie bei String. In Java hat man nur letztere Möglichkeit.
Die Generics in C# sind auch nicht schlecht, nur das API aus dem .Net Framework 1.x. Ich habe auch immer kritisiert, dass die Generics nicht von Anfang an dabei waren. Dafür haben sie Runtime-Support, ich kann nach T casten, kann Ts instanzieren, kann den Typ getten und habe eine sehr ordentliche Constraint-Syntax. Wenn man das alles von Anfang an eingebaut hätte, wäre das erste .Net erst 2 Jahre später erschienen. Hätte mich persönlich natürlich nicht gestört, aber so eine Plattform von Microsoft war mehr als überfällig.
Nötig ist natürlich keines der erwähnten Features, aber diese Features haben gerade eben die Aufgabe, sehr häufig wiederkehrende Aufgaben zu vereinfachen. Was man nicht braucht, ist Komma-Operator überladen wie in C++. Aber ein Dictionary, von dem logisch gesehen ein Array nur als ein Spezialfall mit int als Indizes zu verstehen ist, sollte man schon mit [] indizieren können. Und auch hier hat man wieder eine sehr saubere Unterscheidung zwischen getter-[] und setter-[], nicht so wie in C++ wo man diese beiden Fällle gar nicht auseinanderhalten kann. Insofern würde ich sagen, dass C# sehr viele gute Ideen schon auch mitgebracht hat.
-
Cool, jetzt geben sich's die Java und C#-Anhänger zur Abwechslung mal richtig

Und auch hier hat man wieder eine sehr saubere Unterscheidung zwischen getter-[] und setter-[], nicht so wie in C++ wo man diese beiden Fällle gar nicht auseinanderhalten kann.
Scott Meyers stellt in MEC++ eine Technik vor, die eine Unterscheidung zw. Lese - und Schreibzugriff ermöglicht.
MfG
GPC
-
java fan schrieb:
Was mich persönlich auch begeistert hat bei der Programmierung in Java war der massive Einfluss von OpenSource Software. Man denke dabei nur an Ant, Maven, Spring, Struts, Hibernate, etc.. Allesamt Innovationen im Java Bereich, die erst nach und nach auch in der .NET Welt durch Portierungen verfügbar werden.
Irgendwie redest du von einer Einrichtung die eben auf Java ausgerichtet ist. Aber du magst schon recht haben, dass es für Java mehr OpenSource-Libraries gibt.
Bei Java finde ich aber dass es viel mehr viel coolere Entwicklungstools gibt - da hat .NET noch einiges aufzuholen.
Coolere Entwicklungstools? Welche? Eclipse das bis jetzt noch keinen ordentlichen GUI-Designer hat (VE ist ja wohl ein Witz)? JBuilder? IBM-RAD für 5000 Flocken? JDeveloper der außer langsam und oraclebasiert auch noch buggy ist?
Cool ist es natürlich schon, das Eclipse. Aber Visual Studio ist nunmal Visual Studio. Da kommt imho nichtmal IBM-RAD alias Ich-Habe-Alles-Integriert ran

MfG SideWinder
-
Die Sprachen unterscheiden sich dort wo ihre Frameworks eingesetzt werden. Zb Java eher im Serverbereich/Internetbereich. C# eher im Clientbereich.
Achja: Wirklich 'cool' ist nur wer beide Sprachen beherrscht

MfG SideWinder
-
Borland Studio 2006 und gut ist, C++ C# Java Delphi (etc..) Form-Designer.
Alles in einem, und einer für alles
-
GPC schrieb:
Scott Meyers stellt in MEC++ eine Technik vor, die eine Unterscheidung zw. Lese - und Schreibzugriff ermöglicht.
Das ganze Proxy-Gefrickel ist natürlich genauso elegant wie
T this[int index] { get{ ... } set{ ... } }9 Seiten Text um eine armselige Selbstverständlichkeit nicht zu erreichen, denn wie der Autor selber schreibt, können die Proxies die realen Objekte nicht in jedem Kontext ersetzen. Und wieder ein fetter Workaround mehr um ein schlechtdurchdachtes Sprachfeature zu ersetzen. Denn was auch nicht geht ist
T this[int dimension1, int dimension2, HeightLevel level] { ... } // mehrdim. IndizierungNene, das ist nix gescheites mit dem op[] in C++, das musst du schon wirklich mal zugeben.
-
Eclipse das bis jetzt noch keinen ordentlichen GUI-Designer
Hab noch nie einen GUI-Designer gebraucht. habe immer erst auf Papier das Deisgn grob gezeichnet und dann implementiert. Durch die Layouts ist es sehr leicht die Elemente zu plazieren.
Ich sag es immer wieder: Das einzige was ich in Java wirklich vermisse ist Operator-Überladung.
Es ist schon weitaus bequemer stattmath.Vector vec = new math.Vector(10, 10, 10); vec = vec.mul(vec.add(10));,
math.Vector vec = new math.Vector(10, 10, 10); vec = vec * vec + 10;zu schreiben (ist nur ein Beispiel, soll keine math. Korrektheit darstellen).
List<Integer> liste = new ArrayList<Integer>(50); System.out.println(liste[6]);Ist natürlich weitaus konfortabler.
-
Mir fällt auf, dass bei der Diskussion um die "bessere" Programmiersprache immer nur einige Vorzüge genannt werden, die die jeweilige Sprache aufweist. Man sollte jede Programmiersprache als ganzes betrachten. Jede Sprache hat ihre Vor- und Nachteile. Eine Sprache als schlecht zu bezeichnen, nur weil sie zum Beispiel keine Propertyprozeduren direkt als Sprachmittel unterstützt, ist definitiv falsch!
Ich bin immer noch der Ansicht das es im Endeffekt egal ist mit welcher Sprache man anfängt zu programmieren. Die Syntax einer Sprache zu erlernen ist recht einfach, die Konzepte der Programmierung zu verstehen ist schon deutlich komplizierter
-
@DEvent: Mit deinem Op-Beispiel hast du gerade gezeigt warum es manchmal doch besser ist alles auszuschreiben und keine Operatoren zu verwenden

MfG SideWinder
-
SideWinder schrieb:
@DEvent: Mit deinem Op-Beispiel hast du gerade gezeigt warum es manchmal doch besser ist alles auszuschreiben und keine Operatoren zu verwenden

lustigerweise denke ich anders

vec.add(10);
was macht es?
fuegt es das element 10 zum vec hinzu oder addiert es alle elemente zu 10?bei vec+=10;
ist mir das klar :pwie ueberall gilt: vernuenftige namen fuer vernuenftige operationen. und ein op+ ist nichts anderes als ein standardisierter name.
-
Shade Of Mine schrieb:
SideWinder schrieb:
@DEvent: Mit deinem Op-Beispiel hast du gerade gezeigt warum es manchmal doch besser ist alles auszuschreiben und keine Operatoren zu verwenden

lustigerweise denke ich anders

vec.add(10);
was macht es?
fuegt es das element 10 zum vec hinzu oder addiert es alle elemente zu 10?bei vec+=10;
ist mir das klar :pwie ueberall gilt: vernuenftige namen fuer vernuenftige operationen. und ein op+ ist nichts anderes als ein standardisierter name.
In jedem Fall ist es eine Operation, die es mathematisch so nicht gibt. Die stellt ein Fehldesign dar. "Vektor + Skalar" ist Unsinn.
Shade: Was ist das denn jetzt für eine Operation? Mir persönlich ist das nicht klar geworden. Kann immer noch so ziemlich alles sein, weil dieser "standardisierte Name" in diesem Zusammenhang einfach für gar nichts steht?
-
...und: Ich persönlich gehe eigentlich immer davon aus, dass "*" eine höhere Priorität als "+" hat. Die Beispiele sind somit noch nichtmal äquivalent. ...da wurden im zweiten Fall Klammern vergessen. ...etwas, was ohne Operatorüberladung so nicht möglich ist.
-
Also vector += 10 löst bei mir schon auch ein mulmiges Gefühl aus... obwohl ich generell eher ein Befürworter von Operator-Überladung bin. Aber es muss sinnvoll sein, wie in C#. Da ist garantiert, dass && zuerst die linke Seite auswertet, dass += äquivalent zu ... = ... + ... ist und man auf vernünftige Weise zwischen setten und getten beim Indexer unterscheiden kann. Operator overloading kann man also schon vernünftig hinkriegen und dann macht die Sache Spaß.

-
ne vector addition ist fuer mich jetzt nicht wirklich etwas verwirrendes. aber ok. ungewoehnlich ist es allemal, keine frage.
worum es mir aber eher geht ist, dass operatoren ueberladung definierte namen fuer definierte operationen sind und das standard argument "ich kann ja nen op+ machen der subtrahiert" einfach nur bullshit ist

-
Ich bringe einfach mal ein paar Argumente für beide Seiten:
- Das Argument mit dem Framework hebt sich quasi auf da auch Java eine VM braucht (jre) hab aber jetzt keine Ahnung wie groß das teil is'
- Andererseits ist die java virtual machine (noch) viel weiter verbreitet als das Framework. (Liegt wohl an den ganzen Java Applets im Netz)- Ein paar Worte über die Performance:
- Java ist von der Geschwinigkeit her eher ... naja ... laaaaaaaaaaaaaangsaaaaaaaaaaaam (obwohl ich auch durchaus komplexe Programme in Java gesehn hab die flüssig liefen
- C# ist da schon einiges schneller (das liegt wohl am Microsoft-Bonus
)
- Zusätzlich soll ab Windows Vista ANGEBLICH das Framework hardwarebeschleunigt laufen und später sogar die WinAPI ersetzen (ob das gut geht?? o.O)- Über die ganzen Librarys in Java kann ich nicht wirklich was sagen da ich mich mit java nicht so intensiv beschäftigt hab wie mit c#
- Das Framework ist was die Funktionen angeht allerdings gewatlig, was sowohl gut als auch schlecht ist. Denn es kann schonmal vorkommen das ein einziger Funktionsaufruf so ziemlich alles auslöst was das System an Funktionen zu bieten hat ( denn wer weiß schon was das Framework im Hintergrund so alles macht
), und das nagt natürlich an der Performance- Dennoch fehlen dem Framework NOCH einige meiner Meinung nach essentielle Funktionen ( z.B. kann man die Position der Scrollbar einer TextBox nicht bestimmen ohne die API zu kapseln -.-
Naja, die Entscheidung liegt letztendlich bei dir, ich würde dir (falls du es noch nicht kannst) zu C++ raten und dann später auf Java oder C# umsteigen da beide Sprachen auf C/C++ aufbauen
greetz, DeX
-
Optimizer schrieb:
GPC schrieb:
Scott Meyers stellt in MEC++ eine Technik vor, die eine Unterscheidung zw. Lese - und Schreibzugriff ermöglicht.
Das ganze Proxy-Gefrickel ist natürlich genauso elegant wie
T this[int index] { get{ ... } set{ ... } }9 Seiten Text um eine armselige Selbstverständlichkeit nicht zu erreichen, denn wie der Autor selber schreibt, können die Proxies die realen Objekte nicht in jedem Kontext ersetzen. Und wieder ein fetter Workaround mehr um ein schlechtdurchdachtes Sprachfeature zu ersetzen. Denn was auch nicht geht ist
T this[int dimension1, int dimension2, HeightLevel level] { ... } // mehrdim. IndizierungNene, das ist nix gescheites mit dem op[] in C++, das musst du schon wirklich mal zugeben.
Ich gebe ja auch zu, dass es (a) ziemlich suckt und (b) nicht 100% funktioniert, aber du hast behauptet es ginge gar nicht. Und es geht, wenn auch nicht optimal.
-
Coolere Entwicklungstools? Welche? Eclipse das bis jetzt noch keinen ordentlichen GUI-Designer hat (VE ist ja wohl ein Witz)? JBuilder? IBM-RAD für 5000 Flocken? JDeveloper der außer langsam und oraclebasiert auch noch buggy ist?
Cool ist es natürlich schon, das Eclipse. Aber Visual Studio ist nunmal Visual Studio. Da kommt imho nichtmal IBM-RAD alias Ich-Habe-Alles-Integriert ran
Ich habe mich bei der Aussage bezüglich den Entwicklungstools auch gar nicht auf Klicki-Bunti-Editoren bezogen, sondern viel grundlegendere Features, wie Quick Fix, automatische Code Formatierung, interne History, Code Completition über alle Packages hinweg (also auch wenn ich das jeweilige Package nicht importiert habe), bessere Unterstützung für Refactoring, integrierte Unit-Testing Funktionalität (die Team Suite Edition lass ich in dem Fall mal aussen vor), kontinuierliche Builds (was ich bei Visual Studio tagtäglich vermisse), etc..
Da kann ich eigentlich ganz gut damit leben, dass Visual Editor nicht mit dem Windows Forms Designer mithalten kann, denn die GUI wird wohl ohnehin nicht den größten Teil der Anwendung ausmachen.
Für wirklich gelungen halte ich allerdings den Debugger von Visual Studio (ich sag nur Edit&Continue).Aber das schweift halt vom Thema ab, da wir hier IDEs vergleichen und nicht die Sprache selbst.
-
java fan schrieb:
Für wirklich gelungen halte ich allerdings den Debugger von Visual Studio (ich sag nur Edit&Continue).
Das geht doch mit dem Eclipse Debugger auch, wenn die änderung nicht zu schwerwiegend ist, kann man ganz einfach speichern und die Funktion nochmal debuggen.
Kann man beim neuen VS Debugger Funktionen auswerten lassen? Kann man schön Multithreading debuggen, also die Callstacks der einzelnen Threads sehen und durch einfaches anklicken zwischen den Threads welcheln?