CSharp ein Agklatsch von Java?



  • Hi,
    Viele behaupten, dass C# nur ein Abklatsch von Java sei. Meiner Meinung nach ist das Quatsch, denn in C# hat sich ja doch mehr C++ als Java verewigt. Wie denkt ihr darüber? 🙂



  • Also ein Abklatsch ists bestimmt nicht. Abklatsch klingt in meinen Ohren arg negativ, mit Assoziationen wie billig gemacht, fehlerhaft implementiert, nur nachahmend usw. Das ist es sicherlich nicht.

    C# ist arg an Java angelehnt, keine Frage. Hab schon kleine Programme gesehen über 10 Seiten die in C# höchstens 10 Zeilen anders haben als in Java - des waren dann die anderen Bibliotheksfuktionen 😉

    Aber C# macht auch einiges besser, weil es aus Fehlern gelernt hat und mit den neuen Java Versionen ist es ja sogar so das Sun Features reingenommen hat die von C# stammen.

    Also es sind nahe Verwandte was die Syntax angeht, technisch gibts aber arge Unterschiede, da hat C# mit dem .Net Framework die technisch bessere, wenn vielleicht auch nicht ganz so ausgereifte Plattform unterm Hintern.



  • Zwergli schrieb:

    da hat C# mit dem .Net Framework die technisch bessere, wenn vielleicht auch nicht ganz so ausgereifte Plattform unterm Hintern.

    Inwiefern technisch besser?



  • Einige Dinge sind besser implementiert in .Net(wenn ich mich auch auf C# beziehe sind das meiste ja Features des Frameworks)

    Als Beispiel sein mal die primitiven Datentypen in Java genannt. Java entstand zu einer Zeit als die Resourcen aufn Computer noch um einiges knapper waren und da wollte man auf jeden Fall vermeiden das Primitive Datentypen wie int, double etc. Klassen sind, weil das zu viel Overhead gebracht hätte. Also führt man die primitiven Datentypen ein, und schreibt Wrapperklassen dazu. Das Autoboxing ab Java 5 ist nur so nen halbherziger Schritt diesen Unterschied ein wenig zu vertuschen, aus histoischen Gründen kann man das nun aber nicht mehr ändern.
    In C# ist des anders, da gibt es solche Sonderbehandlung für primitive Typen nicht und es ist wirklich alles von Object abgeleitet. Deshalb kann ich auch ohne weiteres 5.ToString() schreiben - vom Sinn des Beispiels mal abgesehen ist das OO konsequenter.

    Als 2. Beispiel die Generics: In Java sind die Generics ein Compilerfeature. Sprich der Compiler sieht die generischen Typen und generiert daraus für die Runtime die konkreten Typen zur Laufzeit in dem altbekannten Bytecode. Die Runtime kennt keine Generics! In .Net ist das anders. Der IL Code kennt Generics und damit auch die .Net Runtime. Das hat den Vorteil das Typen die in C# mit Generics geschrieben werden, auch in VB.Net oder jeder beliebigen anderen .Net Sprache benutzt werden können. Für die Java Plattform gibts ja auch andere Sprachen die Bytecode als Target haben, die haben von den Generics in Java aber kein bisschen, weil der Bytecode sowas halt nicht unterstützt.

    Dann noch die Interoperabilität. Ich geh wirklich mal nur für Windows aus weil das momentan die Hauptplattform ist wo .Net Java in Bedrängnis bringt, und da liegt der Vorteil in Sachen andere Technologien einbinden klar bei .Net.
    Es ist ohne weiteres möglich Office Technologien einzubinden, man kann die ganzen Serverdienste nutzen, ActiveDirectory, die ganze Rechteverwaltung von Windows etc. All des ist Java so gut wie verwehrt. Nun mag man streiten ob das nen Vor- oder Nachteil ist alles aus einer Hand von einem Hersteller zu benutzen. Aber wenns ins Businesumfeld geht, da muss Technologie einfach funktionieren und das tut es bei .Net wirklich quer durchs Beet mit allen möglich MS Programmen die man sich vorstellen kann und das ist ein nicht zu unterschätzender Faktor wenns darum geht eine Umgebung zu schaffen wo alles möglichst nah aneinandergreift.

    Vielleicht noch ein paar Beispiel aus der Sprache C#: Delegates, Events, Properties und Attribute. Das sind 4 Feinheiten die das Leben arg erleichtern. Man hat in C# für Events nen Schlüsselwort und muss nicht wie in Java jedes mal des Event Pattern neu schreiben. Grund dafür sind die Delegates dies so in Java nicht gibt. Properties sind Ersatz für diese Set/Get Methoden - ist "nur" syntaktischer Zucker, macht den Code aber um einiges intuitiver. Und Attribute hat ja sogar Java in Form der Annotations reingenommen, hatte die vor C# auch nicht.

    Wie man hoffentlich sieht ist an einigen Stellen das .Net Framework dem Java Framework überlegen. Mit .Net 3.0 wirds für Java übrigens nicht besser 🙂 An der Runtime wurde nichts geändert aber es kam zum Beispiel die WPF - das lässt Java GUIs wie 10 Jahre alter Tabbak aussehen 🙂 Java hat keine 3D beschleunigte Oberfläche mit in der Klassenbibliothek. Wie gesagt, ich bezieh mich hier auf Windows als Konkurrenzplattform. Das Java im allgemeinen eher plattformunabhängig ist dürfte bekannt sein. Aber technisch ists dem .Net Framework auf Windows unterlegen.



  • Zwergli schrieb:

    Das Java im allgemeinen eher plattformunabhängig ist dürfte bekannt sein. Aber technisch ists dem .Net Framework auf Windows unterlegen.

    da hast du natürlich recht, aber man darf nicht vergessen, dass bei java die platformunabhängigkeit eine sehr grosse und wichtige rolle spielt. java ist wirklich eine virtuelle plattform und kann sich deshalb nur auf den kleinsten gemeinsamen nenner der grossen betriebsysteme beziehen. dass es mit java schwierig ist, in der windows-registry herumzuwurschteln oder windows-dienste zu manipulieren ist daher kein wunder (muss man dafür eben JNI-erweiterungen nehmen). seinen vorteil kann java aber dann ausspielen, wenn es um portierung geht. beispiel: in einem mehrere 1000 codezeilen grossen java-projekt (ursprünglich für windows) brauchte nur eine zeile geändert zu werden, damit es auf linux und solaris perfekt läuft (hab' ich schon erlebt).
    .NET hingegen ist nichts weiter als die logische weiterentwicklung von visual-basic, delphi, mfc und ähnlichem. eine ms-proprietäre geschichte, spezialisiert um die entwickung von windows-anwendungen zu beschleunigen und zu erleichtern...
    🙂



  • Dieser Thread wurde von Moderator/in AndreasW aus dem Forum C# und .NET in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Als 2. Beispiel die Generics: In Java sind die Generics ein Compilerfeature. Sprich der Compiler sieht die generischen Typen und generiert daraus für die Runtime die konkreten Typen zur Laufzeit in dem altbekannten Bytecode. Die Runtime kennt keine Generics! In .Net ist das anders. Der IL Code kennt Generics und damit auch die .Net Runtime. Das hat den Vorteil das Typen die in C# mit Generics geschrieben werden, auch in VB.Net oder jeder beliebigen anderen .Net Sprache benutzt werden können. Für die Java Plattform gibts ja auch andere Sprachen die Bytecode als Target haben, die haben von den Generics in Java aber kein bisschen, weil der Bytecode sowas halt nicht unterstützt.

    Das fand ich damals auch blöd, obwohl sowas ähnliches wie Generics schon mit C++ bekannt war, hat man Generics erst in Java 1.5 übernommen. In C# wurde ja der selbe Fehler dann wieder begangen, indem man Generics nicht schon seit der ersten Version in die Sprache aufgenommen hat.



  • DEvent schrieb:

    Das fand ich damals auch blöd, obwohl sowas ähnliches wie Generics schon mit C++ bekannt war, hat man Generics erst in Java 1.5 übernommen.

    Bei solchen Aussagen rollen sich mir regelmäßig die Fußnägel auf - sorry 😃
    Wie kann man nur Templates mit Generics gleichsetzen? 😉

    In C# wurde ja der selbe Fehler dann wieder begangen, indem man Generics nicht schon seit der ersten Version in die Sprache aufgenommen hat.

    Ich vermute dass das eher aus Zeitnot gemacht wurde. Immerhin gehen .NET Generics wie bereits erwähnt wurde wesentlich tiefer als die von Java.


Log in to reply