Java <-> C# Vergleich



  • Java und C# geben sich nicht viel. Das eine ist halt das Orginal, das andere ne aufgebohrte standardisierte Kopie. Bei Java finde ich aber dass es viel mehr viel coolere Entwicklungstools gibt - da hat .NET noch einiges aufzuholen.



  • Java und C# geben sich nicht viel. Das eine ist halt das Orginal, das andere ne aufgebohrte standardisierte Kopie. Bei Java finde ich aber dass es viel mehr viel coolere Entwicklungstools gibt - da hat .NET noch einiges aufzuholen.

    Ja da muss ich dir wohl Recht geben. Wobei GNU Emacs ist immer noch meine LieblingsIDE (und ja Emacs ist eine IDE ^^ - Debugger, Compiler.. alles lässt sich ohne weiteres aus dem Emacs aufrufen :)).

    Aber was ich eigentlich sagen wollte ist das sich alle Programmiersprachen in den grundlegenden Konzepte _sehr stark_ ähneln. Delphi und C++ unterstützen z.B. beide das Konzept der Objektorientierung (als Beispiel: Beide Sprachen verwenden Klassen). Die Sprachen unterscheiden sich größtenteils nur durch die Syntax.



  • Headhunter schrieb:

    Java und C# geben sich nicht viel. Das eine ist halt das Orginal, das andere ne aufgebohrte standardisierte Kopie.

    Ich finde, dass C# inzwischen schon einen sehr eigenen Stil entwickelt hat, auch wenn die Wurzeln natürlich erkennbar sind. Selbst wenn man den unsafe-Kram weglässt, unterscheiden sich die Sprachen immer noch massiv. C# hat einige Features mehr, das Interface-implementieren-System funktioniert anders, es gibt value classes und Sprachmittel für properties, delegates und events, die ich sehr gerne und sehr ausgiebig nutze. Auf diese Features verzichte ich schon lange nicht mehr gerne.

    Bei C# 3.0 kommt mit den lambda expressions noch eine gute Portion funktionale Programmierung hinzu.



  • Hi,

    klar, C# kann mehr und ist cooler. Interessant ist aber, dass viele der Features die du erwähnt hast, einfach per leichte Bytecodeänderungen machen kann. Also für LINQ oder Properties braucht man keinen fundamental anderen Aufbau, sowas sollte bei Java auch möglich sein, wird aber beschnitten. Mal schauen was Groovy bringt 🙂



  • 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. Indizierung
    

    Nene, 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 statt

    math.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 :p

    wie 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 :p

    wie 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 😉


Anmelden zum Antworten