Java <-> C# Vergleich
-
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?
-
DerDing schrieb:
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?Du stellst Fragen.

Der VS-Debugger ist sogar mit eigenen Debug-Ansichten erweiterbar. Zum Beispiel gibt es für std::vector eine Ansicht im Debugger, die einfach die Elemente Array-mäßig darstellt. Normalerweise sieht man da nämlich vor lauter Template-Gemurks und Implementierungsdetails überhaupt nicht mehr raus, was für Elemente im Vector drin sind. Dito eine Datentabelle. Klickst auf die Lupe und schon kommt ein neues Fenster mit einer Excel-Darstellung der Tabelle (und Editiermöglichkeit). Und man kann auch eigene Debug-Ansichten schreiben.
-
Der Debugger ist gut, ansonsten ist Visual C++ aber eher schrott.
-
Optimizer schrieb:
DerDing schrieb:
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?Du stellst Fragen.

Der VS-Debugger ist sogar mit eigenen Debug-Ansichten erweiterbar. Zum Beispiel gibt es für std::vector eine Ansicht im Debugger, die einfach die Elemente Array-mäßig darstellt. Normalerweise sieht man da nämlich vor lauter Template-Gemurks und Implementierungsdetails überhaupt nicht mehr raus, was für Elemente im Vector drin sind. Dito eine Datentabelle. Klickst auf die Lupe und schon kommt ein neues Fenster mit einer Excel-Darstellung der Tabelle (und Editiermöglichkeit). Und man kann auch eigene Debug-Ansichten schreiben.
Du beantwortest meine Fragen nicht.

Kann man z.B. sowas während des Debuggens auswerten?"Hallo".length() + System.currentTimeMillis()Wie siehts mit Multithreading-Debugging aus?
-
DeX3 schrieb:
- 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)Wenn Du solche Behauptungen in einem Thread aufstellst, solltest Du sie auch belegen oder zumindest die entsprechenden Quellen angeben, die Dir diesbezüglich als Indizien dienen.
Ansonsten ist Deine Aussage wertlos. ...nur Blah-Blah.
Hier ist die Gegenbehauptung: Java muss sich gegenüber C# bezüglich der Performance ganz sicher nicht verstecken.
Wer hat jetzt Recht?
-
DerDing schrieb:
"Hallo".length() + System.currentTimeMillis()Freilich, kein Problem.
Wie siehts mit Multithreading-Debugging aus?
Alles, was du aufgezählt hast, gibt es seit VS5. Muss es ja auch, was wäre denn das, wenn ich nur den Start-Thread ansehen kann? Völlig nutzloser Müll wäre das.

Ich denke, man kann schon mit großer Wahrscheinlichkeit davon ausgehen, dass der Debugger von VS mit einer großen Wahrscheinlichkeit zu den allerbesten zählt. Dafür kann VS in anderen Bereichen recht wenig, vor allem Code-Analyse, Refactoring und solche Dinge sind recht mager. Der GUI-Designer ist schön zu bedienen, aber leider krass verbuggt. Und er ist vom Konzept her falsch (erzeugt Instanz der Basisklasse und interpretiert seinen eigenen Code um das Panel korrekt darzustellen). Wenn man eigene Properties zuweist, setzt man die der Basisklasse, das ist sehr unintuitiv. Oft steigt der Designer auch einfach nur aus und man muss VS neu starten. Basisklasse darf nicht abstrakt oder generisch sein, Basisklasse darf nicht mal Foo<int> sein sondern man muss von Foo<int> ableiten und das IntFoo als Basisklasse für die zu designende Klasse verwenden.
Diese Problem kommen alle von dem, wie der Designer vom Konzept her funktioniert. Bei Netbeans ist das besser, das erstellt ein XML File und kann nur daraus immer wieder den kompletten Source neu generieren. Das XML wird auch zur Darstellung der Form benutzt, daher muss auch keine Instanz der Basisklasse erzeugt werden.
Das ist so mal mein Eindruck von VS, seit einem halben Jahr habe ich eine 40h/Woche damit, deshalb hab ich schon viele Macken selbst erleben müssen.

-
Gregor schrieb:
Hier ist die Gegenbehauptung: Java muss sich gegenüber C# bezüglich der Performance ganz sicher nicht verstecken.
Wer hat jetzt Recht?
Du, zumindest wenn man das viel zitierte "langsame" Swing betrachtet. In meiner Arbeit benutzen wir GUI-Komponenten von Developer Express, die zeichnen sich auch selbst und zwar grottenlangsam. Sie sind sehr cool, man kann sie schön themen, sind sehr flexibel und können viel. So viel, dass es mit nativen Widgets nicht möglich wäre, das nachzubauen. Wir sind auch sehr zufrieden damit, aber man merkt beim resizen der Forms schon krass, wie langsam der Neuaufbau ist. Solche Probleme hatte ich mit Swing unter Linux auch, aber unter Windows lief das immer schon total flüssig. Wenn mein Linux-Kenntnisse sich nicht auf die Shell beschränken würden, wäre das dort sicherlich auch schön hinzukriegen.
-
SideWinder schrieb:
@DEvent: Mit deinem Op-Beispiel hast du gerade gezeigt warum es manchmal doch besser ist alles auszuschreiben und keine Operatoren zu verwenden

MfG SideWinder
Dabei habs ichs doch extra hingeschrieben das es nur ein Beispiel sein soll...
Dann eben sowas:Integer zahl; Integer ergebnis = zahl.add(zahl2.mul(zahl3)); // oder ergebnis = zahl + zahl2 * zahl3;Jetzt plügt das wieder auseiander wie schlecht das Beispiel auch ist und das es Mathematisch nicht korrekt und laber laber.
es soll nur ein Beispiel sein
..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.
Extra für dich: es soll nur ein Beispiel sein
-
Optimizer schrieb:
"Hallo".length() + System.currentTimeMillis()Freilich, kein Problem.
Wie? Wenn ich im VS6 strlen("Hallo") in die Überwachung ziehe, bekomme ich als Eergebniss void?
Und viele andere Funktionen kennt er einfach garnicht.Wie siehts mit Multithreading-Debugging aus?
Alles, was du aufgezählt hast, gibt es seit VS5. Muss es ja auch, was wäre denn das, wenn ich nur den Start-Thread ansehen kann? Völlig nutzloser Müll wäre das.

Das ich einen Breakpoint irgendwo im Code des gestarteten Threads setzen kann und er dort Anhält geht. Aber wie kann ich jetzt, wenn er da steht, wieder zu einem anderen Thread springen und dort weiter debuggen? Kann ich irgend einen Thread anklicken und einfach mal so anhalten (ohne extra einen Breakpoint zu setzen)? Wo sehe ich welche Threads gerade laufen? So wie hier links oben.
-
DerDing schrieb:
Optimizer schrieb:
"Hallo".length() + System.currentTimeMillis()Freilich, kein Problem.
Wie? Wenn ich im VS6 strlen("Hallo") in die Überwachung ziehe, bekomme ich als Eergebniss void?
Und viele andere Funktionen kennt er einfach garnicht.Ich rede auch nicht vom grottigen C++-Debugger. Du sagst immer "VS", also beziehst dich auf das ganze Visual Studio. Dann kann ich mir auch den besten aussuchen, den für die Java-ähnlichste Sprache (außer J#). Für C++ gibt es nirgendwo einen gescheiten, das ist einfach nochmal eine andere Welt. Du benutzt ein Framework, benutz ich auch eins, dann ist der Vergleich fair. Trotzdem ist vermutlich auch der C++-Debugger von VS einer der besten, aber natürlich nicht so gut wie ein gängiger für Java.
Wie siehts mit Multithreading-Debugging aus?
Alles, was du aufgezählt hast, gibt es seit VS5. Muss es ja auch, was wäre denn das, wenn ich nur den Start-Thread ansehen kann? Völlig nutzloser Müll wäre das.

Das ich einen Breakpoint irgendwo im Code des gestarteten Threads setzen kann und er dort Anhält geht. Aber wie kann ich jetzt, wenn er da steht, wieder zu einem anderen Thread springen und dort weiter debuggen? Kann ich irgend einen Thread anklicken und einfach mal so anhalten (ohne extra einen Breakpoint zu setzen)? Wo sehe ich welche Threads gerade laufen? So wie hier links oben.
Dann wirf mal einen Blick in das "Debug->Windows"-Menü. Keine Ahnung ob du es in der C++-IDE an der gleichen Stelle findest, aber das gibt's da auch irgendwo. Geh einfach davon aus, dass ich beide Debugger schon mal in der Hand hatte, das führt aber sowieso zu nichts, du redest hier von der Grundausstattung. Das findest du bei jedem Debugger.
DEvent schrieb:
Jetzt plügt das wieder auseiander wie schlecht das Beispiel auch ist und das es Mathematisch nicht korrekt und laber laber.
es soll nur ein Beispiel sein
Wenn du zeigen willst, dass operator overloading sinnvoll ist, dann solltest du auch ein sinnvolles Beispiel geben.

-
Also sorry, aber vieles was hier erzählt wird, finde ich auch in der C++ Welt. Und der C++ Debugger vom VC++ ist nicht grottig. Ich konnte schon 1998 (VC++6.0, vielleicht auch schon früher?) Code zur Laufzeit ändern und mit dem neuen Code weiter arbeiten. Konnte ich das mit Java 1.3 und Eclipse 2.1 machen? NEIN!
So, dann jetzt der Knaller: gibt es für Java einen Debugger mit dem ich rückwärts debuggen kann? Da ich das nicht 100%ig weiß, frage ich hier wertfrei: gibts das für Java oder C#?
Für C++ gibts sowas: UndoDB. http://www.undo-software.com/So, ich kann jetzt hier wirklich Geschütze auffahren, die C++ zu einer mächtigen Entwicklungs-Sprache machen. Ich kann auch Refactoringtools für C++ nennen, die ähnliches wie Refactorings von Eclipse und NetBeans bieten:
http://www.refpp.com/ Da unter Demo einfach mal das Video anschauen.
Man muß sich nur informieren was es alles für C++ gibt, und nicht nur die VC++ IDE von MS anschauen. Die ist zwar schon sehr gut, deckt aber noch lange nicht alles ab, was es für C++ gibt.
-
Ich habe aber gerne mit einer IDE alles abgedeckt. Viele Zusatztools für weitere Features laufen haben müssen ist nicht so meins.
Und auch völlig wertfrei: Wofür möchte ich rückwärts debuggen? Ist damit nur ein "Ich gehe einen SChritt zurück" gemeint?
MfG SideWinder
-
Optimizer schrieb:
Dann wirf mal einen Blick in das "Debug->Windows"-Menü. Keine Ahnung ob du es in der C++-IDE an der gleichen Stelle findest, aber das gibt's da auch irgendwo. Geh einfach davon aus, dass ich beide Debugger schon mal in der Hand hatte, das führt aber sowieso zu nichts, du redest hier von der Grundausstattung. Das findest du bei jedem Debugger.
Tatsächlich. Ist zwar etwas umständlich sich immer da durchzuklicken, aber es geht.
Rückwärts debuggen hab ich noch nie gemacht, aber es bringt doch nur für ein paar Schritte was, wenn man mal wieder zu schnell auf "nächsten Schritt" geklickt hat, das fehlt es mir manchmal. Werden dann beim Rückwärtsdebuggen die Operationen wieder rückgängig gemacht z.B. Iterator zurückgesetzt, gezeichnete Sachen wieder entfernt, Daten von der Festplatte/DB gelöscht?