Was kann C# besser als Java?
-
Shade Of Mine schrieb:
Das kann dir mit Funktionen nicht so schnell passieren, da du hier ja *explizit* einen Namen vergeben musst. Und wenn du sowieso weißt, dass du "allen Elementen einen Wert X zuweisen" implementiert hast, dann kannst du deine Funktion auch *genau* passend benennen.
Wie sieht es jetzt aber aus, wenn ich interfaces habe. Wenn ich zB das interface Assignable habe, dann habe ich die Methode assign() die ich jetzt ueberladen muss. Dann ist dies doch sehr aehnlich zu einem op= oder? Denn ich habe ein Symbol dem ich ein Verhalten "zuweisen" muss.
Ich sehe zwei Unterscheide:
Dein Assignable-Interface hat a) einen viel kleineren "Scope" und b) eine genau dokumentierte *benutzerdefinierte* Bedeutung. Du hast dein Shade-Framework gebaut und da ein Konzept "Assignable" erdacht. Dieses hast du genau spezifiziert, vielleicht mir Vor- und Nachbedingung. Ich gehe jetzt her und implementiere dein Interface. Da es dein Interface ist, muss ich natürlich in der Dokumentation prüfen, ob meine Implementation den von dir aufgestellten Vertrag erfüllt.Ein Operator hingegen hat eine Bedeutung im globalen Kontext die in der Regel eher "traditionell" gewachsen ist, als an einer Stelle fest dokumentiert(manchmal hat ein Operator auch eine Bedeutung die speziell für eine bestimmte Sprache gilt - wie z.B. der operator= in C++. Dann bist du zwar nicht mehr so global wie bei +, aber immer noch nicht im Bereich von "benutzerdefinierte Bedeutung" im Framework X).
-
Wären da jetzt nciht die ganz fiesen Sprachen, die das Freie Benennen von Operatoren gestatten würde wäre das ganze sicherlich eine gute Erklärung :p
Wenn ich mir jetzt einen Operator ::: definiere, was macht er dann? Jetzt sag nicht, das das unsinn sei. Ich finde diese Möglichkeit ziemlich genial. Wenn es für etwas in der Mathematik keine passende Vorlage gibt, in diesem Framework diese aufgabe aber ständig und immer wieder in der Form vorkommt kann sowas sehr vereinfachend wirken, ähnlich, wie auch ein + zum Addieren das ganze übersichtlicher macht, als eine add-Funktion.
-
Ich finde, dass es durchaus nicht schaden kann, operator overloading einzuschränken.
Scott Meyers (sinngemäß) schrieb:
Was möglich ist, wird ein Programmierer irgendwann auch mal tun.
Sprich: -- zum Trennen einer Verbindung, überladen von || und des Komma-Operators (zum erschießen).
Den Ansatz von C# finde ich nicht schlecht, weil er doch einige Freiheiten lässt aber gleichzeitig trotzdem z.B. erzwingt, dass a = b einem a = ab entspricht.
Dass Operatorüberladung in Java ganz fehlt, stört mich manchmal schon auch ein bisschen.Wenn ich mir jetzt einen Operator ::: definiere, was macht er dann? Jetzt sag nicht, das das unsinn sei. Ich finde diese Möglichkeit ziemlich genial.
Ich absolut nicht.
Für solche krassen Sonderwünsche kann man durchaus mal ne Funktion schreiben. Oder soll ich mir vielleicht 'x' für das Kreuzprodukt und . für mein Skalarprodukt überladen? Da wirst du aber staunen, wenn du den Punkt verwenden willst.
-
Ich habe eine Bruch-Klasse.
Bsp.:
frac a = (2,3);
frac b;
b = frac(2,7) / a * frac(33,7) / sqrt(a);Möchte mal wissen, wie man sowas ohne Verrenkungen beim Lesen ohne Overloading hinbekommt.
Macht kann missbraucht werden, aber deswegen sollte sie nicht abgeschafft werden. Java ist ein prima Beispiel für eine kastrierte Sprache.
-
Helium schrieb:
Wären da jetzt nciht die ganz fiesen Sprachen, die das Freie Benennen von Operatoren gestatten würde wäre das ganze sicherlich eine gute Erklärung :p
Ich habe mich in meinen Ausführungen implizit auf C++ und ähnliche Sprachen beschränkt, sprich auf Sprachen, die die Menge der überladbaren Operatoren sowie deren Präzedenzregeln fest definiert (hätte ich vielleicht sagen sollen).
In dem Moment wo du eigene Operatoren hinzufügen kannst bzw. die Präzedenz eingebauter Operatoren ändern kannst, bist du zweifelsohne in einer ganz anderen Liga mit ganz anderen Regeln. Hier baust du natürlich nicht mehr ausschließlich auf eine "traditionelle" Semantik. Zwar habe ich schon mal mit Sprachen die derartiges bieten (Prolog, Haskel) gearbeitet, wirklich Ahnung habe ich von diesen Sprachen aber nicht. Insofern kann ich dazu nicht viel sinnvolles sagen. Ich denke aber, dass Nutzer dieser Sprachen ganz anders an das Thema rangehen. Wenn ich das richtig sehe sind Operatoren hier ja eigentlich nur Funktionen mit "lustigen" Namen. Es geht hier also wohl nicht so sehr um Polymorphie (neue Implementation für bekannte Operation).
-
Shade Of Mine schrieb:
Gregor schrieb:
1. Ja, momentan kann man neben Java nur 189 andere Sprachen nutzen, um Java-Bytecode zu erzeugen: Programming Languages for the Java Virtual Machine
Und wer macht das?
Die meisten Sprachen benötigt natürlich keiner. Warum auch: Java ist für die meisten Dinge genausogut oder besser geeignet als andere Sprachen. Allerdings gibt es schon ein paar Sprachen für die JVM, die eine gewisse Relevanz haben. Groovy ist zum Beispiel eine relativ neue Sprache für die JVM, die sehr interessant ist. Ich kann mir auch vorstellen, dass es manchmal sehr gut ist, eine Sprache eines anderen Programmierparadigmas für die JVM zur Verfügung zu haben. Zum Beispiel Prolog und Lisp.
Für die ganzen Operator-Overloading-Fanatiker hier ist sicherlich ein Pre-Translator wie SubJava oder ein Preprozessor wie JPP interessant, welche einem diese Möglichkeit bieten.
-
Das mit der Lesbarkeit von mathematischen Ausdrücken ist schon ein Argument, aber auch, das man mit einer korrekt benannten Funktion unter Umständen manchmal durchaus besser beraten ist: Bsp.:
DrawPrimitive drwPrim;//irgendein grafisches Objekt POINT ptViewOffset..... POINT ptRealCoordOffset..... drwPrim += ptViewOffset;//was nune?? drwPrim.OffsetRealCoords( ptRealCoordOffset ); drwPrim.OffsetViewCoords( ptViewOffset );
Für mich, der eher nur Trivial - mathematik anwendet ist das noch kein wirkliches Argument für / oder gegen Java, auch wenn ich rein gefühlsmäßig auch lieber alle Möglichkeiten habe (ich möchte, auch das es schön Kracht, wenn ich mit ungültigen Pointer arbeite :)). this. sieht auch immer noch etwas ungewohnt aus
Stichwort Präprozessor: Giebt es was vergleichbares in Java / C#?
[Edit]
Da hab ich wohl etwas daneben gelegen, es ging ja um C# vs. Java. Da ich beides nur ansatzweise praktisch ausprobiert habe, fällt mir auf, das der Einstieg in C# ein gutes Stück leichter ist. Es ist in C# relativ schnell möglich ein kleines Proggi mit ein paar Zeilen Code zusammen zu bekommen (das sogar irgendwas sinnvolles tut), ohne sich vorher groß damit beschäftigt zu haben.
Kann aber auch durchaus sein, das ich da als VC Benutzer einfach nur den IDE - Heimvorteil ins Spiel bringe :).
-
Optimizer schrieb:
Wenn ich mir jetzt einen Operator ::: definiere, was macht er dann? Jetzt sag nicht, das das unsinn sei. Ich finde diese Möglichkeit ziemlich genial.
Ich absolut nicht.
Für solche krassen Sonderwünsche kann man durchaus mal ne Funktion schreiben. Oder soll ich mir vielleicht 'x' für das Kreuzprodukt und . für mein Skalarprodukt überladen? Da wirst du aber staunen, wenn du den Punkt verwenden willst.
Nein auf keinen Fall. Das ist es ja. Das sind keine sonderwünsche. Beispielsweise ist das aneinanderhängen zweier Listen in einer funktionalen Sprache genauso essentiell, wie das addieren in der Mathematik. Dementsprechend brauchst du auch eine kurze, übersichtliche Schreibweise.
@Gregor:
Danke für die Seite. Auch wenn die meisten Sachen da ciht besonders interessant waren ist JMatch doch verdammt genial und ich werde mich damit mal näher beschäftigen. Java mit Patternmatching wie in funktionalen Sprachen, ... sogar ansatzweise das logische Paradigma. Sieht ziemlich genial aus.Wäre Java von sich aus so wäre ich schon längst umgestiegen. Aber JMAtch wird vermutlich weiterhin eine Randgruppensprache bleiben
-
c# ist von microsoft?
für mich ein grund c# nicht zu lernen...
-
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.
-
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
-
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