Aus welchen Gründen sollte ich C # anstelle von Java und C ++ wählen? [geschlossen]

46

C # scheint heutzutage populär zu sein. Ich habe gehört, dass es syntaktisch fast dasselbe ist wie Java. Java und C ++ gibt es schon länger. Aus welchen Gründen sollte ich C # anstelle von Java und C ++ wählen?

Dunkler Templer
quelle
16
Wie geschrieben war die Frage ein Lehrbuchbeispiel für nicht konstruktive "Welche Sprache ist besser?" Fragen, die hier nicht zum Thema gehören. Ich habe versucht, es mit einer Bearbeitung konstruktiver zu gestalten, da es tatsächlich gute, gut durchdachte Antworten gab. Beachten Sie dennoch die FAQ und diesen Blog-Beitrag , wenn Sie Fragen dieser Art stellen.
Adam Lear
Lassen Sie mich einige kantigere Elemente hinzufügen. .NET hat ein gut definiertes DOM ( z. B. CodeDOM ) für seine Sprache, und folglich ist es viel einfacher und effizienter, Dinge zur Laufzeit dynamisch zu generieren. Dies kann auch als Infrastrukturfunktion hilfreich sein. Außerdem weist das Typensystem eine 1: 1-Übereinstimmung mit allen nativen W3-Typen auf. Im Kern wurden W3 und andere Interops von Anfang an in die Sprache eingebunden. Für andere Sprachen waren diese Bedenken nur auf den Punkt gebracht und stellen sie vor viele Herausforderungen. Auch wenn Sie mit vielen Sprachen und / oder Protokollen
interagieren,
5
Hey, JoeGeeky, füge deinen Kommentar als Antwort auf die Frage hinzu.
Anthony Mastrean
1
Die eigentliche Frage lautet: Aus welchen Gründen sollte ich Nemerle, F * und F # anstelle von C # wählen? (dh, alle drei Sprachen sind von MS und alle drei sind besser)
Mrsteve
Ich glaube wirklich nicht, dass eine Aussage des Genres "Sprache / Plattform X im Vergleich zu Sprache / Plattform Y ist IMMER besser" gültig ist, und ich denke auch, dass sie für jedes X und Y für bestimmte Kontexte leicht ungültig gemacht werden kann. Was ist der Sinn dieser Frage?
Shivan Dragon

Antworten:

76

Die Frage sollte lauten: "Welche Sprache eignet sich besser für die moderne, typische Anwendungsentwicklung?".

Bearbeiten: Ich habe einige der folgenden Kommentare angesprochen. Eine kleine Bemerkung: Bedenken Sie, dass es ein großer Unterschied ist, wenn Sie viele Dinge von Haus aus als Redewendungen haben, als sie jedes Mal selbst zu implementieren oder herunterzuladen und zu verwenden. Fast alles kann in einer dieser Sprachen implementiert werden. Die Frage ist - was die Sprachen Ihnen von Haus aus bieten.

Also aus dem Häuschen (einige Argumente gelten für beide Sprachen) ...

C # ist in folgenden Punkten besser als C ++:

  • Es hat native Müllabfuhr.
  • Sie können die Signaturen von Klassenmethoden als freie Funktionen behandeln (dh das statisch typisierte thisZeigerargument ignorieren ) und so dynamischere und flexiblere Beziehungen zwischen Klassen herstellen. bearbeiten , wenn Sie nicht wissen , das bedeutet , was, dann versuchen Sie ein Element Methode zuweisen Leere zurückkehrt und die Annahme ungültig zu einer void (*ptr)()Variablen. C # -Delegierte tragen den thisZeiger mit sich, aber der Benutzer muss sich nicht immer darum kümmern. Sie können void()jedem anderen void()Delegaten einfach eine Methode einer beliebigen Klasse zuweisen .
  • Es hat eine riesige Standardbibliothek mit so vielen nützlichen Dingen, die gut implementiert und einfach zu bedienen sind.
  • Es erlaubt sowohl verwaltete als auch native Codeblöcke.
  • Durch die Versionsverwaltung von Assemblys können Probleme mit der DLL-Hölle leicht behoben werden.
  • Sie können Klassen, Methoden und Felder so festlegen, dass sie assemblierungsintern sind (dh, sie können von jeder Stelle in der DLL aufgerufen werden, in der sie deklariert wurden, jedoch nicht von anderen Assemblys).

C # ist in folgenden Punkten besser als Java:

  • Anstelle von viel Rauschen (EJB, private statische Klassenimplementierungen usw.) erhalten Sie elegante und benutzerfreundliche native Konstrukte wie Properties und Events.
  • Sie haben echte Generika (nicht den schlechten Casting-Witz, den Java Generika nennt), und Sie können darüber nachdenken.
  • Es unterstützt native Ressourcenmanagement-Redewendungen (die usingAnweisung). Java 7 wird dies ebenfalls unterstützen, aber C # hat es schon viel länger.
  • Es hat keine Ausnahmen überprüft :) (fraglich, ob dies gut oder schlecht ist)
  • Es ist tief in Windows integriert, wenn es das ist, was Sie wollen.
  • Es verfügt über Lambdas und LINQ und unterstützt daher einen kleinen Teil der funktionalen Programmierung.
  • Es lässt sowohl generische Kovarianz als auch Kontravarianz explizit zu.
  • Es hat dynamische Variablen, wenn Sie sie wollen.
  • Bessere Aufzählungsunterstützung mit der yieldAnweisung.
  • Hiermit können Sie neue Werttypen (oder Nichtreferenztypen) definieren.

Bearbeiten - Kommentare adressieren

  • Ich habe nicht gesagt, dass C ++ natives RAII nicht unterstützt. Ich sagte, Java hat es nicht (Sie müssen es explizit versuchen / endlich). C ++ verfügt über automatische Zeiger, die sich hervorragend für RAII eignen und (wenn Sie wissen, was Sie tun) auch die Garbage Collection ersetzen können.
  • Ich habe nichts darüber gesagt, freie Funktionen zu emulieren . Wenn Sie beispielsweise über einen thisZeiger auf ein Feld zugreifen und die Methode, die es ausführt, an einen generischen Funktionszeiger binden müssen (dh nicht in derselben Klasse), gibt es einfach keine systemeigene Möglichkeit, dies zu tun. In C # erhalten Sie das kostenlos. Sie müssen nicht einmal wissen, wie es funktioniert.
  • Mit "Mitgliedsmethoden als freie Funktionen behandeln" meine ich, dass Sie beispielsweise eine Mitgliedsmethode nicht nativ an eine Signatur einer freien Funktion binden können, da die Mitgliedsmethode "heimlich" den thisZeiger benötigt.
  • Die usingAussage ist offensichtlich zusammen mit IDisposable-Wrappern ein großartiges Beispiel für RAII. Siehe diesen Link . Bedenken Sie, dass Sie in C # nicht so viel RAII benötigen wie in C ++, da Sie über den GC verfügen. Für die spezifischen Zeiten, die Sie benötigen, können Sie die usingAnweisung explizit verwenden . Noch eine kleine Erinnerung: Das Freigeben von Speicher ist ein teures Verfahren. GC hat in vielen Fällen einen Leistungsvorteil (insbesondere, wenn Sie über viel Speicher verfügen). Der Speicher wird nicht durchgesickert, und Sie werden nicht viel Zeit für das Aufheben der Zuweisung aufwenden. Darüber hinaus ist die Zuweisung auch schneller, da Sie nicht immer nur ab und zu Speicher zuweisen. Beim Aufruf newwird einfach ein Last-Object-Pointer inkrementiert.
  • Msgstr "C # ist insofern schlimmer, als es eine Speicherbereinigung hat". Dies ist in der Tat subjektiv, aber wie ich oben festgestellt habe, ist die Speicherbereinigung für die modernste, typische Anwendungsentwicklung ein gewaltiger Vorteil.
    In C ++ können Sie entweder Ihren Speicher manuell mit newund verwalten delete, was empirisch immer hier und da zu Fehlern führt, oder Sie können (in C ++ 11) Auto-Zeiger nativ verwenden, bedenken Sie jedoch, dass sie viele, viele hinzufügen von Rauschen auf den Code. GC hat also immer noch einen Vorteil.
  • "Generika sind viel schwächer als Vorlagen" - ich weiß nur nicht, woher Sie das haben. Vorlagen haben vielleicht ihre Vorteile, aber meiner Erfahrung nach sind generische Parametertypprüfung, Kontravarianz und Kovarianz viel stärkere und elegantere Werkzeuge. Die Stärke von Vorlagen ist, dass Sie ein wenig mit der Sprache spielen können, was zwar cool ist, aber auch viele Kopfschmerzen verursacht, wenn Sie etwas debuggen möchten. Alles in allem haben Vorlagen ihre schönen Funktionen, aber ich finde Generika praktischer und übersichtlicher.
Yam Marcovic
quelle
5
Und wenn Sie immer noch einen Garbage Collector für C ++ benötigen, können Sie einen herunterladen .
Fredoverflow
3
Lassen Sie uns diese Diskussion im Chat fortsetzen
Yam Marcovic
6
Ein weiteres wichtiges Feature in C # im Vergleich zu Java ist aus Leistungsgründen "struct", ein Objekttyp, der auf dem Stack (oder in speziellen Fällen in CPU-Registern) gespeichert oder in andere Heap-Objekte eingebettet werden kann. Sie werden häufig für kleine Objekte mit 1 bis 4 Feldern verwendet, z. B. X-, Y-Koordinatenpaare.
Qwertie
2
@LokiAstari Stört es dich zu erklären? Solange Sie daran denken, die Registrierung von Ereignishandlern aufzuheben und das Dispose-Muster für Klassen zu verwenden, die native Wrapper enthalten, ist alles in Ordnung. Das ist viel weniger zu wissen und zu merken als die Speicherverwaltung in C ++.
Yam Marcovic
2
-1, da mir die Abschnitte "C ++ ist darin besser als C # ..." und "Java ist besser als C # ..." fehlen. Ich denke nicht, dass C # in allen Bereichen überlegen ist, daher fehlen einer Antwort ohne diese beiden Abschnitte wahrscheinlich einige wichtige Informationen.
Giorgio
30

Die Umgebung

.NET Framework- und Windows-Clients

Windows ist das dominierende Betriebssystem auf Clientcomputern. Die besten GUI-Frameworks für Windows-Anwendungen sind Winforms und WPF zusammen mit .NET Framework . Die beste Programmiersprache für .NET Framework und seine APIs ist C # . Java ist hierfür keine Alternative. Und C ++ ist eine ältere Sprache ohne automatische Speicherverwaltung. C # ähnelt C ++, verfügt jedoch über eine automatische Speicherverwaltung und Sie müssen nicht mit Zeigern arbeiten, wodurch Sie produktiver werden. C ++ kann in einigen Fällen immer noch die beste Option sein, jedoch nicht für formularintensive Datenbankanwendungen, die in Unternehmen üblich sind.

IIS und Windows Server

Wenn Sie es gewohnt sind, in der Windows-Umgebung und mit C # zu arbeiten, benötigen Sie die geringste Investition, um IIS für die Serverprogrammierung und Windows Server für die grundlegende Verwaltung zu erlernen.

Active Directory und Windows Server

Wenn Sie Software entwickeln, die in Unternehmensnetzwerken bereitgestellt werden soll, wird wahrscheinlich eine Windows-zentrierte Umgebung unter Verwendung eines Windows-Servers mit Active Directory verwendet. In einer solchen Umgebung ist es einfacher, eine in C # und .NET Framework erstellte Lösung zu integrieren und bereitzustellen .

Persönlich bin ich ein Java-Entwickler, kein C # -Entwickler, aber ich arbeite mit dem Web. Ich würde zu C # wechseln, wenn ich Netzwerkanwendungen für Windows-Netzwerke entwickeln würde. Aber ich bevorzuge Java für Linux-basierte Webserver. Ich würde C ++ für eingebettete Systeme wählen, wenn ich nicht viele Abhängigkeiten hätte.

Ja, C # ist eine bessere Sprache mit moderneren Funktionen als C ++ und Java, aber das ist nicht das Wichtigste für die Wahl von C # .

Zusammenfassung

Die Umgebung für Ihre Software ist für die Auswahl von C # am wichtigsten . Wenn Sie in einer Umgebung mit Windows-Clients, Windows-Servern, Active Directory, IIS und möglicherweise SQL Server arbeiten, ist C # die mit Abstand beste Sprache in .NET Framework .

Wenn Sie in einer Unix-Umgebung mit z. B. Webdiensten arbeiten, ist Java meine Wahl. Und wenn Sie mit eingebetteten Systemen arbeiten oder mit Hardwaregeräten integrieren müssen, ist C ++ eine gute Wahl.

Jonas
quelle
3
Absolut - deshalb benutze ich C # nicht wirklich aus irgendeinem anderen Grund
Murph
Sie können .NET auch auf anderen Plattformen über Mono, MonoTouch und MonoDroid verwenden. Meine Benchmarks haben jedoch ergeben, dass Mono unter Windows deutlich langsamer ist als .NET, und Microsofts eigenes Compact Framework ist unter Windows CE extrem langsam: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... natürlich ist WPF nur unter Windows verfügbar (aber ich mag es trotzdem nicht.)
Qwertie
Welche Abhängigkeiten meinst du mit "Ich würde C ++ für eingebettete Systeme wählen, wenn ich nicht viele Abhängigkeiten hätte." Meinen Sie die Java-Bibliotheken?
Puckl
@Puckl ja, aber meistens die jvm / jre.
Jonas
"Wenn Sie in einer Unix-Umgebung mit z. B. Webdiensten arbeiten", gibt es einige andere Sprachen und Frameworks, die in Betracht gezogen werden könnten: Ruby, Python, node.js usw.
MarkJ
15

C # und Java

C # ist eine sehr gute Sprache, wenn:

  • Sie möchten eine objektorientierte Entwicklung für allgemeine Zwecke durchführen. Es ist eine klassische, statisch typisierte OOP-Sprache.
  • Sie richten sich nur an Microsoft-Plattformen (Microsoft hat Java effektiv geklont, um C # zu erstellen, da sie eine Java-ähnliche Sprache wollten, die Benutzer an Windows bindet. Sie hätten Java verwenden können, aber die Benutzer hätten Anwendungen auf einfache Weise ausführen können.) andere Plattformen ....)

C # als Sprache ist in verschiedener Hinsicht besser als Java (bessere Syntax für Eigenschaften, Werttypen, reifizierte Generika usw.). Ich bevorzuge C # als Sprache gegenüber Java, aber im Großen und Ganzen sind sie ziemlich ähnliche Sprachen und für ähnliche Anwendungen geeignet.

Andererseits hat Java auch einige große Vorteile:

  • Riesiges Open-Source-Ökosystem - die Bibliotheken für Java, die Sie kostenlos erhalten können, sind bei weitem die besten in jeder Sprache. Es ist schwer zu übertreiben, wie wichtig dies ist - Java ist sehr effektiv, wenn es darum geht, Dinge zu erledigen.
  • Tools - Die Java-Tools sind aus meiner Sicht besser als das, was man in der .Net-Welt bekommen kann. Besonders beeindruckend ist zB Maven (wenn Sie es einmal gemeistert haben!).
  • Wartbarkeit - Java ist seit einiger Zeit in großen Unternehmen erfolgreich, gerade weil es relativ stabil ist und große Anstrengungen unternommen wurden, um die Abwärtskompatibilität zu gewährleisten. Die einfache und leicht ausführliche Syntax hilft auch hier Java - es ist einfacher, Code zu lesen und zu pflegen, wenn der Code sehr klar und eindeutig ist.
  • Neue Sprachen - Die JVM verfügt über einige erstaunliche neue Sprachen (Scala, Clojure, Groovy usw.), die die Zukunft der Java-Plattform darstellen. Hier findet ein Großteil der Sprachinnovationen statt, und zwar viel schneller als in Java oder C #.

Java vs. C # ist also eine ziemlich knappe Angelegenheit und es kommt wirklich darauf an, ob Sie im Microsoft-Camp oder im Open Source / Cross-Platform-Camp sein wollen.

Ich persönlich bevorzuge Java, weil:

  • Das Bibliotheks-Ökosystem ist meiner Meinung nach viel wichtiger als die Tatsache, dass C # eine schönere Syntax als Java hat
  • Langfristig möchte ich, dass mein gesamter Code plattformübergreifend funktioniert und auf großen Clustern billiger Linux-Computer in der Cloud ausgeführt werden kann.
  • Clojure ist momentan die vielversprechendste Sprache der Welt. Wenn ich mich an die JVM-Plattform halte, kann ich meinen Code und meine Fähigkeiten im Laufe der Zeit problemlos in Clojure umwandeln.

C / C ++

C / C ++ ist im Grunde ein ganz anderes Biest. Ich würde nicht für allgemeine Zwecke Anwendungsentwicklung heute aus folgenden Gründen empfehlen:

  • Speicherverwaltung - Für die meisten allgemeinen Programmieraufgaben möchten Sie heutzutage nicht mehr Ihren eigenen Speicher verwalten. Die Garbage Collection in C # oder Java ist für Ihre Produktivität und Sicherheit viel besser als alle expliziten Speicherverwaltungstechniken, die Sie in C / C ++ verwenden müssen
  • Komplexität - Insbesondere C ++ ist eine äußerst komplexe Sprache. Es dauert sehr lange, den Code selbst zu beherrschen, und er kann auch teuflisch komplex sein. (C ++ Templates zum Beispiel sind besonders haarig ....)
  • Produktivität - die meiste Zeit und alles andere als gleich, dauert es länger, bis die Dinge in C / C ++ erledigt sind.

Es ist jedoch zweifellos eine gute Wahl in einer bestimmten begrenzten Anzahl von Spezialgebieten, insbesondere:

  • Betriebssysteme - Sie möchten wahrscheinlich C / C ++ verwenden, wenn Sie ein Betriebssystem schreiben.
  • Spieleentwicklung - fast alle der besten kommerziellen Spiele-Engines sind C / C ++. Es ist immer noch die beste Wahl, wenn Sie einen anspruchsvollen AAA-Titel entwickeln (C # und Java eignen sich perfekt für weniger anspruchsvolle / Gelegenheitsspiele).
  • Hochleistungsrechnen - Optimiertes C / C ++ ist wahrscheinlich der beste Weg, um Hochleistungscode zu erstellen. Für die meisten Anwendungen ist diese Optimierungsstufe nicht die Mühe wert, kann aber in bestimmten Bereichen äußerst wertvoll sein (z. B. beim Hochfrequenzhandel).
  • Hardwarezugriff - Sie benötigen direkten Zugriff auf die Hardware (zB für ein Embedded System)

Grundsätzlich ist C / C ++ genau dann eine gute Wahl, wenn Sie sich auf eine der Domänen konzentrieren, für die es besonders gut geeignet ist.

mikera
quelle
1
Sie erwähnen Maven als Beispiel für bessere Tools für Java. Ich bin damit nicht besonders vertraut, aber in der Dokumentation sieht Maven dem nativen .NET-Build-Tool MSBuild ziemlich ähnlich. Was macht Maven besser als MSBuild?
Kevin Cathcart
1
+! (nur weil ich nur eine Stimme habe): Sie haben sehr gut erklärt, warum das Java-Ökosystem besser ist und warum man nicht nur die Syntax von C # mit Java vergleichen sollte. Java hat mehr und bessere Bibliotheken und Werkzeuge. In der Java-Sprache selbst passiert nicht viel, aber für die JVM erscheinen neue, sehr interessante Sprachen, die (IMO) viel interessanter sind als C #. Ich kenne Clojure nicht, aber ich finde Scala sehr interessant: Entwickelt, um von Anfang an OOP + FP zu sein.
Giorgio
2
Warum ist jeder der Meinung, dass C ++ - Code voll von manueller Speicherverwaltung ist? Es ist nicht C, wie Sie wissen, RAII bedeutet, dass Sie fast nie manuell Speicher zuweisen / freigeben müssen (die Zeiten, in denen Sie dies tun, sind diejenigen, in denen eine Sprache wie C # für Sie nutzlos wäre).
gbjbaanb
3
@gbjbaanb - wahrscheinlich, weil RAII nicht für die allgemeine Speicherverwaltung geeignet ist. Es ist in keiner Weise so flexibel wie ein vollständiges GC-System, wie Sie es in Java oder C # sehen. Sobald Sie die Grenzen von RAII überschreiten, befinden Sie sich wieder im Bereich der manuellen Speicherverwaltung.
mikera
3
@mikera Ich möchte nur darauf hinweisen, dass es auch auf der .NET-Plattform einiges an Sprachentwicklung gibt. ZB F # ist eine nette funktionale Sprache, die den Rest von .NET nahtlos integriert, und Python wurde kürzlich als Iron Python nach .NET portiert (und hat auch eine nette IDE !).
ikh
13
I heard that syntactically they are almost the same.

Syntaktisch? Wer gibt einem fliegenden Affen etwas über Syntax? Syntax ist nur für eines gut: eine schnellere Migration von syntaktisch ähnlichen Sprachen. Das ist es.

C # ist viel besser als Java. Berücksichtigen Sie die generische und funktionale Programmierunterstützung - C # ist Java weit voraus. Ganz zu schweigen von Überladungen von Operatoren und anderen nützlichen Dingen - C # ist wesentlich besser. Es gibt keine Möglichkeit, dass Java möglicherweise als besser als C # angesehen werden könnte.

C ++ und C # sind eher ein Wettbewerb. C ++ hat ein unglaublich ärgerliches archaisches Kompilierungsmodell und eine Reihe älterer Krankheiten aus C, aber seine Vorlagen sind weitaus leistungsfähiger als Generika, und seine Ansätze zur Ressourcenverwaltung sind im Allgemeinen viel flexibler und leistungsfähiger, ebenso usingwie ein vollständiger Fehler, der ausgeführt wird schneller.

DeadMG
quelle
6
Ich denke, man sollte beide Sprachfunktionen und die Verfügbarkeit einer Sprache auf verschiedenen Plattformen vergleichen. Mit C # ist man bei Microsoft eingesperrt, mit Java nicht: Das ist ein großer Vorteil, zumindest für UNIX / Linux-Entwickler. OOP + FP sind coole Funktionen, aber warum sollten Sie sich mit C # befassen, wenn Sie Scala verwenden können, das auf der JVM ausgeführt wird und mit älterem Java-Code kompatibel ist? Ich würde niemals eine plattformspezifische Sprache lernen, wenn ich nicht dazu gezwungen wäre.
Giorgio
2
@ Giorgio: Das Mono-Projekt existiert. Aber zweitens kümmert sich Microsoft tatsächlich um ihre Plattform - sie bieten regelmäßig große Upgrades an. Java hat kaum etwas Neues gehabt. Die Frage bezieht sich auch auf C # vs Java, nicht auf CLR vs JVM.
DeadMG
4
@DeadMG: Soweit ich weiß, kann ich kein C # -Programm, das unter Windows entwickelt wurde, mit Mono erstellen. Nicht CLR vs JVM? Die Frage ist, warum Menschen C # oder Java verwenden. Damit Benutzer eine Sprache verwenden können, benötigen sie eine Laufzeitumgebung und ein Betriebssystem. Ich diskutiere nicht über die Tatsache, dass C # mehr Funktionen als Java hat, aber Java ist viel portabler: Dies ist ein Faktor, der die Übernahme einer Sprache beeinflussen kann. Tatsächlich wird Java immer noch viel häufiger als C # verwendet, auch wenn bestimmte erweiterte Funktionen fehlen.
Giorgio
3
@Giorgio, du kannst jedes C # -Programm nehmen und es mit Mono erstellen. Sie können bestimmte Bibliotheken nicht verwenden (die ohnehin nicht Teil der C # -Sprache sind). Und Java ist nicht "viel portabler". Sie können beispielsweise in C # für iOS, aber nicht in Java programmieren.
SK-logic
2
@ Giogio, Mono ist mindestens so portabel wie JVM.
SK-logic
7

Nun C#hat einige nette eingebaute Funktionen wie LINQund Delegierte. Es wird das Beste aus beiden Welten - Javaund C++. Schauen Sie hier für einen vollständigen Vergleich.

Aber ich mag die JavaWelt besser - viel mehr Open Source Frameworks und sie läuft auf jeder Plattform. Und erzähl mir nichts davon Mono- es ist keine verlässliche Option.

Petar Minchev
quelle
9
+1: "Aber ich mag die Java-Welt besser - viel mehr Open-Source-Frameworks und sie läuft auf jeder Plattform." Hoffen wir, dass Oracle dies nicht ändert!
Giorgio
15
Was ist in Mono nicht "zuverlässig"?
SK-logic
2
@ Petar Minchev, Es ist nichts als deine eigene Schuld. Sie müssen die Portabilitätsrichtlinien befolgen und sollten keine nicht portierbaren Bibliotheken verwenden. Auf diese Weise kann jede komplexe Anwendung zuverlässig mit Mono ausgeführt werden. Dinge wie WPF werden niemals portiert.
SK-logic
2
@Petar Minchev, es gibt viele nicht portable Java-Bibliotheken. Sie müssen bei der Portabilität immer vorsichtig sein, unabhängig davon, welche Sprache Sie verwenden. Außerdem geht es um die Sprachen, nicht um die Bibliotheken von Drittanbietern.
SK-logic
3
@ Petar Minchev, GTK # ist portabel. Verwenden Sie es stattdessen.
SK-logic
3

Laut einigen Quellen (siehe zB http://www.indeed.com/jobtrends ) ist C # immer noch weniger beliebt als Java und genauso beliebt wie C ++.

C # bietet Funktionen, die Java nicht bietet, z. B. direkte Unterstützung bestimmter Programmiersprachen wie Eigenschaften, funktionaler Programmierstil usw. C # hat einen höheren Abstraktionsgrad als C ++, was ein Vorteil ist, wenn die Entwicklungszeit wichtiger ist als die Programmgeschwindigkeit.

Ich persönlich bevorzuge immer noch die Java / C ++ - Welten. Wie Petar Minchev sagte, hat Java mehr Open-Source-Frameworks und -Anwendungen, läuft überall und ist weniger an einen bestimmten Hersteller und ein bestimmtes Betriebssystem gebunden. C ++ hat ähnliche Vorteile, obwohl Code häufig Anpassungen von einer Plattform zur anderen benötigt. Da ich lieber unter Linux entwickle und C # meines Wissens unter Linux nicht vollständig beherrschen kann, habe ich nie wirklich Interesse an C # gezeigt, da meine Programmieranforderungen von C, C ++, Java und Scala abgedeckt werden.

Auf der anderen Seite ist es für viele Entwickler kein Problem, an einen bestimmten Anbieter gebunden zu sein: Microsoft hat eine beherrschende Stellung auf dem Markt für Betriebssysteme und C # bietet viele Beschäftigungsmöglichkeiten. Daher verwenden viele Entwickler von IMO C #, da es nicht nur eine funktionsreiche Sprache ist, sondern auch eine gute Investition darstellt.

Giorgio
quelle
"Ich kann unter Linux kein vollwertiges C # haben" - Könnten Sie das näher erläutern? Meinen Sie damit, dass das vollständige .Net-Framework nicht verfügbar ist, weil unter Linux keine Probleme mit der C # -Sprache selbst (oder mit F #) aufgetreten sind?
Wesley Wiser
@wawa: Meines Wissens entspricht das .Net-Framework dem JDK, und das .Net-Framework ist nur für Windows verfügbar, während das JDK für mehrere Betriebssysteme verfügbar ist. Wenn dies nicht korrekt ist, kann ich meine Antwort bearbeiten (und auch meine Meinung ändern).
Giorgio
1
Ich denke, eine nähere Analogie wäre die Basisklassenbibliothek zum JDK. Die BCL hat standardisierte und nicht standardisierte Teile. Das Monoprojekt implementiert sowohl die standardisierten als auch einen Großteil der nicht standardisierten Stücke.
Wesley Wiser
@wawa: Danke für die Information. Ich denke darüber nach, C # mit Mono auszuprobieren. Dennoch habe ich immer noch das starke Gefühl, dass C # viel stärker an Microsoft gebunden ist als Java an Oracle (oder Sun in der Vergangenheit).
Giorgio
3

Was ist mit "Welches Software Development Framework, das eine Programmiersprache enthält" besser?

Sie haben vergessen, andere Dinge einzubeziehen, wie die "Umgebung", mit der Sie arbeiten werden.

  1. Werden Sie nur für Windows-Betriebssysteme arbeiten, müssen aber nicht auf niedrigem Niveau sein und über viel Arbeitsspeicher und andere Ressourcen verfügen?

    Wählen Sie .NET als Framework über Windows und verwenden Sie C #.

  2. Werden Sie nur für Windows arbeiten, müssen aber nicht auf niedrigem Niveau sein, ABER nicht über viele Ressourcen verfügen?

    Wählen Sie das Delphi-Framework (und die Programmiersprache Object Pascal Delphi oder Lazarus Object Pascal).

  3. Ist deine App. benötigt, um mehrere Plattformen, wie ein Spiel, in verschiedenen Handys zu unterstützen?

    Wählen Sie das Java Framework und die Programmiersprache Java.

  4. Ist es Linux mit KDE als grafische Oberfläche?

    Wählen Sie mit C ++ das QT-Framework

  5. Ist es Linux mit Gnome als grafische Oberfläche?

    Wählen Sie mit C ++ das GObject / GLib-Framework

  6. Werden Sie mit vielen Operationen auf niedriger Ebene arbeiten, wie z. B. der Entwicklung von Treibern?

    Plain C oder C ++ wird für mehrere Betriebssysteme mit Standardbibliotheken als Framework verwendet.

Nur meine 2 Cent.

umlcat
quelle
1
Ich bin mir nicht sicher über 3. Smartphones sind heute sehr beliebt und AFAIK, alle unterstützen C # in irgendeiner Form, aber nur Android unterstützt Java.
SVICK
Ist Delphi nicht tot? :)
šljaker
@ šljaker Nein, aber diese Tage sind nicht sehr beliebt.
umlcat
1
@svick: Das ist eine Lüge. Abgesehen von Android gibt es Java in irgendeiner Form auch für iOS, Symbian, WinMo, Blackberry, Maemo und WebOS (dh alles, was wichtig ist oder noch wichtig ist; lassen Sie mich nicht mit noch kleineren Plattformen anfangen). Android, Blackberry und Symbian unterstützen Java offiziell als Entwicklungsoption. Sun unterstützte Java unter iOS, obwohl Apple es nicht mag. Java ist die primäre Entwicklungssprache für Android- und Blackberry-Handys. Ich kann nicht das gleiche mit C # sagen, AFAICT wird nur von WinMo offiziell unterstützt.
Lie Ryan
1

Wenn Sie eine Suche durchführen, stoßen Sie wahrscheinlich auf Diskussionen über die wichtigsten Programmiersprachen. Hier ist eines der Suchergebnisse - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java scheint immer noch die beliebteste Sprache zu sein.

Java hat versucht, einige der Mängel von C ++ zu beseitigen (und das Leben der Programmierer für nicht-Echtzeit- und nicht-kritische Anwendungen zu vereinfachen). Da C # der Neuling in der Partei ist, wurden einige Mängel der Java-Sprache vermieden. C # hat große Fortschritte gemacht (da Microsoft viel Kontrolle darüber hat), während Fortschritte in Java aufgrund von Konflikten zwischen seinen Stakeholdern für einen beträchtlichen Zeitraum blockiert wurden.

Satyajit
quelle
1

Ein paar Dinge, die noch nicht erwähnt wurden:

C # ist besser als C ++, weil:

Es werden keine Header-Dateien mehr benötigt, was sich in einer großen Einfachheit niederschlägt.

C # ist besser als Java, weil:

Es werden benutzerdefinierte Typen vom Typ Referenz (Klasse) und vom Typ Wert (Struktur) unterstützt. Wenn Sie wissen, was Sie tun, können Sie erhebliche Performance-Vorteile erzielen.

Es unterstützt Delegates, die wie Einzelmethodenschnittstellen sind, und vereinfacht so die Codierung häufig vorkommender Konstrukte, die Einzelmethodenobjekte enthalten, erheblich.

Mike Nakis
quelle
Können Sie erklären, auf welche Weise sowohl Referenztyp- als auch Werttyptypen zu Leistungsvorteilen in C # führen können?
Giorgio
Wenn Sie beispielsweise ein Array von Datensätzen haben möchten, haben Sie in Java keine andere Möglichkeit, als Ihren Datensatz mithilfe einer Klasse zu beschreiben, sodass Ihr Array ein Array von Verweisen auf eine Vielzahl von separat zugewiesenen Objekten ist. In C # können Sie Ihren Datensatz mit einer Struktur beschreiben, sodass Ihr Array nur ein zusammenhängender Speicherbereich ist, in dem Ihre Strukturen nacheinander gespeichert werden, wie in C.
Mike Nakis,
Wenn Sie beispielsweise einen kleinen neuen Typ definieren möchten (einen Typ, der in ein Maschinenwort passt), müssen Sie keine neue Klasse dafür definieren. Sie können es einfach zu einer Struktur machen, damit es der Wertesemantik folgt. Das Weitergeben solcher Strukturen ist nicht teurer als das Weitergeben von Verweisen auf Objekte. Sie haben jedoch den Vorteil, dass Sie keine Objekte zuordnen, konstruieren und müllsammeln müssen.
Mike Nakis
Ich verstehe. So werden Klassen auf dem Heap instanziiert und über Referenzen aufgerufen, während Strukturen auf dem Stack instanziiert werden (?)
Giorgio
Fast richtig. Die einzige Ungenauigkeit in dieser Anweisung besteht darin, dass eine Struktur auf dem Heap gefunden wird, wenn sie in ein anderes Objekt eingebettet ist oder sich in einem Array von Strukturen befindet. Und es wird auch auf dem Heap zu finden sein, wenn es jemals geschachtelt wird, genauso wie Werttypen in Java geschachtelt werden.
Mike Nakis
1

Sie sollten die beste Sprache für Ihre erwartete Umgebung und Ihr Fachwissen auswählen.

Wählen Sie C #, wenn Sie in einer Microsoft-Umgebung arbeiten. Während C # unter ISO / IEC 23270: 2003 standardisiert ist, bleibt die Microsoft-Version die einzige vollständige Implementierung. Einige wichtige Teile der Sprache werden vom Standard nicht abgedeckt und unterliegen daher den Patenten von Microsoft. Niemand anderes wird eine vollständig kompatible Version der Sprache für andere Systeme implementieren. Sie sind also so lange an Microsoft Windows und .NET gebunden, wie Sie die Sprache verwenden. Wenn Sie nach Fähigkeiten suchen, die Sie auf dem Mobilfunkmarkt einsetzen können, sollten Sie sich eine andere Sprache zulegen.

Java funktioniert, hat aber einen erheblichen Overhead, was zum Teil auf Funktionen wie Garbage Collection zurückzuführen ist. Java ist auch nicht durch ISO / IEC standardisiert. Sie können also nicht garantieren, dass Sie beim Wechseln von Plattformen und Versionen von Java die besten Absichten von Sun / Oracle haben. Wenn Sie irgendwann planen, mit Android zu arbeiten, ist dies definitiv der richtige Weg. Die Programmierung von Android ist im Grunde Java, mit ein paar Änderungen.

C ++ ist standardisiert und fast alle Compiler folgen dem internationalen Standard, so dass Sie ein garantiertes Verhalten haben, ABER die Sprache schützt Sie nicht vor sich selbst. Sie müssen die Bereinigung und Überlaufprüfung selbst durchführen. Das ist nicht schwer. C / C ++ - Programmierer machen dies seit vielen Jahren. Apple verwendet Objective C für alles. Wenn Sie also auf Apple abzielen möchten, empfehle ich, dies stattdessen zu versuchen.

Wenn Sie Windows irgendwann einmal hinter sich lassen, empfehlen wir Ihnen, sowohl C / C ++ als auch Java zu lernen - beide sind derzeit auf dem Markt erhältlich.

TJ
quelle
0

In Bezug auf C ++ vs C # (da ich nicht über ausreichende Java-Kenntnisse verfüge) fehlt mir hier die Möglichkeit, unter Windows auf Low-Level-Inhalte zuzugreifen. Beispielsweise können Sie in C # (noch) keinen nativen Anzeigetreiber entwickeln, in C ++ jedoch. Dies macht C ++ nicht besser. Ich sehe C ++ versus C # als Assembly versus C.

C # ist meiner Ansicht nach viel effizienter, wenn Sie sich die Zeit ansehen, die für die Implementierung eines Features erforderlich ist. Der Leistungsverlust der .Net-Laufzeit ist für 99% der entwickelten Anwendungen vernachlässigbar. Es kann durchaus von Bedeutung sein, wenn Sie eine enge Schleife haben, aber die meiste Zeit ist eine Anwendung inaktiv und wartet auf jede Art von Eingabe, Signal oder Unterbrechung (Datenträger-E / A, Tastenklick, Netzwerk, Animationsabschluss). .

Die CLR-Bibliothek mit all ihren Funktionen hat einen weiteren großen Vorteil. Als ich C # für Junior-Entwickler trainierte, sagten die meisten, dass sie die logische Namenskonvention von Klassen, Mitgliedern und Namespaces mochten. Es war logisch, im gesamten SDK eine Methode zu finden, an der Visual Basic 5 gravierende Mängel aufwies. Dies hat ihnen bei der Übernahme der Bibliothek enorm geholfen. Nach dem Erlernen der Syntax einer Sprache ist es wichtig, eine neue Bibliothek zu erlernen, um ein gutes Verständnis für ein SDK zu erlangen. Es erspart Ihnen, das Rad neu zu erfinden.

Rob van der Veer
quelle