Was kann C# besser als Java?



  • Stimmt, die Sprache ist zwar ISO-Standardisiert, aber bloß nicht lernen, denn MS hat sie entwickelt.
    Du bist bestimmt einer von denen, die daheim alles auf Windows laufen haben, aber trotzdem Microsoft hassen und sich ständig über Abstürze beschweren.



  • ja bin ich!
    ich habe auf 2 festplatten linux und auf einer windows!
    weißt du auch wieso auf der einen windows ist?
    weil zu viele programme auf windows ausgelegt sind.
    und genau das ist das problem!
    an sich ist windows nämlich mist!
    ansonsten benutze ich keine microsoft programme und versuche sie so gut wie möglich zu meiden...
    also komm nicht mit vermutungen.



  • Ohje, bitte nicht schon wieder einen MS vs. "Der Rest der Welt" Flame Thread!



  • Ohje, bitte nicht schon wieder einen MS vs. "Der Rest der Welt" Flame Thread!

    Welcher Rest????

    :p



  • peterchen schrieb:

    Ohje, bitte nicht schon wieder einen MS vs. "Der Rest der Welt" Flame Thread!

    Welcher Rest????

    :p

    😃 👍 👍 👍



  • Sgt Nukem schrieb:

    peterchen schrieb:

    Ohje, bitte nicht schon wieder einen MS vs. "Der Rest der Welt" Flame Thread!

    Welcher Rest????

    :p

    😃 👍 👍 👍

    👎 👎 😃 👍 👍



  • peterchen schrieb:

    Ohje, bitte nicht schon wieder einen MS vs. "Der Rest der Welt" Flame Thread!

    Welcher Rest????

    :p

    viele leute(inkl. die ganzen linuxer) und ich....



  • Korbinian schrieb:

    Gregor@UNI schrieb:

    Das ist ja auch nicht äquivalent. Mit compareTo kannst du auch die Fälle trennen, wo die Objekte gleich sind und wo obj1 > obj 2. Das kannst du mit dem "<" nicht. Du bräuchtest da also einen Operator mit einer dreiwertigen Logik, den es natürlich nicht gibt.

    hm. du meinst wohl sowas:

    int ret = obj1.compareTo(obj2);
    if (ret > 0) // bla
    else if (ret < 0) // blubb
    else // tralla
    

    hm, schön. ich glaub ich hab dich falsch verstanden :p ich jedenfalls verwende den vergleichsoperator immer spezifiziert:

    if (obj1 < obj2) // blubb
    else if (obj1 < obj) // trulla
    else // tralla
    

    oder was hab ich da jetz falsch verstanden? vielleicht dass man nicht 3 operatoren explizit deklarieren muss, sondern alle drein implementierungen in eine klatscht? wie gesagt, geschmackssache 🙂 ich hoff, java 1.5 kanns, weil ich java demnächst für ein größeres projekt hernehmen will

    edit: dito hume, schön argumentiert 🙂

    Dann mach doch mal ein

    String str1 = "Bla", str2 = "Blubb";
    
    If (str1.equals(str2) // Trallala
    else // Wallala
    

    mit herkömlichen Operatoren wie == und Co.



  • @master_tradiaz:

    Mal ehrlich, der ganze Thread ist doch ein "Wozu brauchen wir das, wir haben doch schon alles?" Diese Grundhaltung, das MS sowieso böse ist, und nur abkupfern kann und nix richtiges (und heir so häufig durchscheint), nervt.

    Java ist von Sun? Ein Grund für mich, das nicht zu lernen. :p



  • @peterchen:

    würde ich nicht generell sagen. Bis auf diese letzte Seite war er eigentlich ganz interessant. Schade eigentlich 😞 .

    @all Javajaner:
    Auch wenns eigentlich nicht in diesen Thread gehört:

    Ich warte immer noch auf meine Frage, was vergleichbares zum Präprozessor von C/C++ in Java/C# in die Hand zu bekommen - der würde mir wirklich fehlen... Alle sonstigen Argumente sind für mich zumindest noch keine wirklichen für / oder gegen eins von beiden.



  • TheBigW schrieb:

    Ich warte immer noch auf meine Frage, was vergleichbares zum Präprozessor von C/C++ in Java/C# in die Hand zu bekommen -

    Ich weiß nur, dass es in C# ein "Conditional"-Attribut gibt, mit dem du zusammen mit den eingebauten Präprozessor-Direktiven sowas machen kannst:

    #define debug
    class Foo 
    {
        [Conditional("debug")]
        static void Assert (bool ok, string errorMsg) 
        {
            if (!ok) 
            {
                Console.WriteString(errorMsg);
                System.Environment.Exit(0);
            }
        }
        static void Main (string[] arg) 
        {
            Assert(arg.Length > 0, "no arguments specified");
            ...
        }
    }
    

    Ist debug definiert, wird die Methode Assert aufgerufen. Ansonsten nicht.

    Bedingte Übersetzung ist in C# also kein Problem. Makros sind aber z.B. nicht machbar.

    Letztlich bin ich also überfragt ob es zu C bzw. C++ vergleichbare Präprozessoren für Java und C# gibt. Es stellt sich mir allerdings auch die Frage, wozu ich sowas brauchen sollte. In der Regel bevorzugt man ja doch eher weniger nach Hack aussehende Herangehensweisen 🙂



  • @Hume

    Das ist doch schonmal ein Ansatz. Es geht mir eigentlich auch eher darum eine Möglichkeit zu haben verschiedenen Versionen ein und desselben Projektstandes zu haben, ohne das ganze Chaos zur Laufzeit zu haben. Z.b.: habe ich ein Projekt, wo spezielle Hardware angesprochen wird. Um überall weiterentwickeln zu können habe ich für diese einen Simulator geschrieben. Mittels Präprozessor #define kann man da ja schick zwischen den zwei Versionen hin und herspringen, ohne den Balast der jeweils anderen mit herumzutragen.

    Wenn das was du geschrieben hast so funktioniert (werds bei Gelegenheit mal testen) ist das ein Punkt für C#. Frage ist, ob das auch wie der Präprozessor funktioniert -> ergo, wenn debug nicht definiert wird die Funktion also nicht von der Runtime in Bytecode übersetzt, sprich ignoriert?

    So Ihr Javajaner: Wie würdet ihr das in Java lösen?



  • Ein Präprozessor hat doch recht wenig mit der Programmiersprache zu tun.
    Der Präprozessor löscht Kommentare, ndef Zeilen, usw...
    Da gibt es sicherlich einige Tools die du nutzen kannst, oder schreib
    dir selber einen.

    Jockel



  • peterchen schrieb:

    @master_tradiaz:
    java ist von Sun? Ein Grund für mich, das nicht zu lernen. :p

    schön.allerdings habe ich feste gründe microsoft zu meiden....



  • TheBigW schrieb:

    So Ihr Javajaner: Wie würdet ihr das in Java lösen?

    Du suchst einen Präprozessor für Java? Guck mal meinen ersten Beitrag in diesem Thread an. Wenn du dem Link da folgst, dann kommst du auch eine Seite, wo es Links zu einigen Präprozessoren für Java gibt.



  • master_tradiaz schrieb:

    peterchen schrieb:

    @master_tradiaz:
    java ist von Sun? Ein Grund für mich, das nicht zu lernen. :p

    schön.allerdings habe ich feste gründe microsoft zu meiden....

    Das ist dein gutes Recht. Aber erwarte nicht das dies jemand dieses Argument
    als Intelligent bezeichnet.

    Ich meide C# weil es mir keinen Mehrwert, sondern nur Nachteile gegenüber
    Java bringt.
    Meiden ist dabei das falsche Wort, ich habe mit der BetaII des .net Frameworks
    auch C# programmiert nur um mich dann aufgrund eigener Erfahrung für Java zu
    entscheiden.

    Dennoch nervt das .net ist scheisse weil von MS. Java ist scheisse weil hat
    nicht Feature XYZ.

    Mann hat sich bei Java ganz bewusst gegen Operatoren Overloading entschieden und
    ich finde das wunderbar. Mir geht leider auch Generics zu weit. Ich will kein
    Java das sich mehr oder weniger an C++ angleicht. Ich habe mich auch bewusst gegen C++ entschieden weil ich die Lesbar/Wartbarkeit von Java schätzen gelernt
    habe.
    Drum sehe ich das nicht sooo positiv, das ein neuer Komplexitätsgrad zu Java hinzukommt.

    Generics und auch Operatoren überladen sind zwar sicher ein tolle Hilfe bei
    der Programmierung aber eines ist gewiss, sie machen Quellcode komplexer zu
    lesen.
    Das wäre kein Problem wenn jeder Programmierer sich anstrengen würde einen
    sauber durchdachten, nachvollziehbaren Code zu schreiben.
    Das Problem ist das es oftmals eben nicht der Fall ist ...



  • TheBigW schrieb:

    Wenn das was du geschrieben hast so funktioniert (werds bei Gelegenheit mal testen) ist das ein Punkt für C#. Frage ist, ob das auch wie der Präprozessor funktioniert -> ergo, wenn debug nicht definiert wird die Funktion also nicht von der Runtime in Bytecode übersetzt, sprich ignoriert?

    So Ihr Javajaner: Wie würdet ihr das in Java lösen?

    Ganz einfach

    class Foo {
    static final boolean debug=true;
    
    public static void main(String[] args) {
      if(debug) {
          System.out.println("debug");
      }
    }
    }
    

    Die if Bedingung wird in diesem Fall zur Compilezeit ausgewertet und gar nicht erst in Bytecode übersetzt. Der Codeblock nach dem if wird nur in Bytecode umgesetzt, wenn die Bedingung true ist.
    Es hat also genau den gleichen Effekt wie mit define in C/C++.

    Man kánn die debug Variable natürlich auch in eine andere Klasse plazieren und es funktioniert immer noch genauso.

    Die Auswertung einer Bedingung zur Compilezeit ist eine Ausnahme, die nur für static final Variablen und auch nur für if Bedingungen gilt.



  • TheBigW schrieb:

    @Hume

    So Ihr Javajaner: Wie würdet ihr das in Java lösen?

    Gegenfrage, ich programmiere Software für Palm, welche auch auf
    Handy (MIDP 2.0 fähige) und MS PocketPC / Windows CE laufen soll.
    Betriebssysteme sind: PalmOS, Windows CE, Smartphone, Symbian

    So ihre C#&C++ (ler): Wie würdet ihr das lösen?



  • DrZoidberg schrieb:

    Die if Bedingung wird in diesem Fall zur Compilezeit ausgewertet und gar nicht erst in Bytecode übersetzt. Der Codeblock nach dem if wird nur in Bytecode umgesetzt, wenn die Bedingung true ist.
    Es hat also genau den gleichen Effekt wie mit define in C/C++.

    Man kánn die debug Variable natürlich auch in eine andere Klasse plazieren und es funktioniert immer noch genauso.

    Die Auswertung einer Bedingung zur Compilezeit ist eine Ausnahme, die nur für static final Variablen und auch nur für if Bedingungen gilt.

    Oh, das ist ja mal äußerst interessant. Ich wußte das noch garnicht. Wo hast du das her?



  • Ehrlich gesagt, wundert mich das, dass dich das überrascht. Der Compiler ist doch auch nicht so blöd und lässt Sachen wie

    if( false )
    

    stehen. static finals auszuwerten ist doch dann nur noch ein ganz kleiner Schritt. 🙂


Anmelden zum Antworten