Was kann C# besser als Java?



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



  • Optimizer schrieb:

    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. 🙂

    Ganz so einfach ist das IMHO nicht. Angenommen, du hast deine Debug-Variable in einer fremden Klasse. Jetzt kompilierst du deine Klasse und kriegst eine class-Datei. Nehmen wir mal an, diese if-Abfrage wurde dabei "wegoptimiert". Jetzt änderst du in der fremden Klasse mit der debug-Variable den Wert der Debug-Variable und kompilierst diese Klasse neu. Was haben wir dann? Einen inkonsistenten Zustand? Im fertigen Programm 50 Klassen, die "Debug-Code" enthalten und 50, die diesen Code nicht enthalten? 🙄



  • Deswegen beginnt bei C++ langsam das sogenannte "Whole Program OPtimization" - wo Compiler lernen alle Übersetzungseinheiten (Module) in der Optimierungsphase nicht mehr getrennt zu behandeln, sondern als eine Einheit.

    Sowas ist natürlich recht praktisch. Ohne soetwas sind IMHO solche Optimierungen nämlich nicht möglich.

    Wie kann man denn in Java solche Sachen wie assert() schreiben? Geht das überhaupt? In PHP geht das nicht und das wurmt mich immer. Und ja: ich weiss, dass es sowohl in Java als auch in PHP ein assert gibt - aber manchmal möchte ich meinen eigenen Code dafür schreiben.



  • Was verstehst du unter "sowas wie assert"? Was macht assert hier für dich aus?



  • Gregor schrieb:

    Was verstehst du unter "sowas wie assert"? Was macht assert hier für dich aus?

    Code der nur in der Debug Version vorhanden ist (zusätzliche checks - am besten in verschiedenen stufen, so dass ich in stufe 1 nur erweiterte checks durchführe, in stufe 2 werden auch die preconditions und postconditions gecheckt und in stufe 3 gibt es zusätzlich noch invarianten checks). Weiters habe ich gerne Debugausgaben (auch in verschiedenen Stufen) - und das löse ich immer gerne zur Compiletime auf. Denn ich will keinen deadcode in meiner binary haben.



  • Klar gibt es assert. Wenn die VM mit ausgeschaltetem assert gestartet wird, wird das assert vom JIT-Compiler nicht beachtet -> du hast auch keinen toten code in den binaries (die sowieso nur im RAM existieren).
    Deshalb sollte die debug-Variable IMHO auch kein Problem sein.



  • Optimizer schrieb:

    Klar gibt es assert.

    Darf ich mich zitieren:

    Und ja: ich weiss, dass es sowohl in Java als auch in PHP ein assert gibt

    Aber ich habe gerne eigene checks und debug ausgaben - dass kann assert nicht alles abdecken.

    logisch: ich kann auch ohne dem leben, aber es ist halt etwas das ich sehr praktisch finde und ich immer ein bisschen vermisse.

    wenn es doch irgendwie gehen sollte, so wie zB in C# (das ist auch nicht ideal, aber wenigstens ein ansatz) würde ich das sehr begrüßen.



  • Naja, wenn das mit dem static final stimmt (was ich nicht bezweifle), ist das eigentlich halb so wild, dass so was fehlt. IMHO.



  • Ich habe vorhin schon auf meinen ersten Beitrag in diesem Thread hingewiesen. Dort wird auf eine Seite verlinkt, die u.a. Informationen zu Java Preprozessoren bietet. Da wird schon irgendetwas dabei sein, womit man sich so ein assert bauen kann.



  • Wenn ihr Beispiele wollt, sucht einfach in google nach conditional compilation java.
    Dann findet ihr z.B. das hier
    http://www.devx.com/tips/Tip/13342

    oder das
    http://c2.com/cgi/wiki?ConditionalCompilationInJava

    Da wird auch ein Beispiel für eine selbst definierte assert Methode gegeben.



  • Wenn ich das also richtig verstanden habe werden static finals also auch zur compile - Zeit übersetzt. Da sie dann nich mehr geändert werden, können if - abfragen bei false dann wirklich komplett rausgeschmissen werden. Die Denkweise ist eben doch eine andere..

    @Gregor:

    Sind die Links von Dir schon in der Java FAQ?


Anmelden zum Antworten