it-swarm.dev

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

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

46
Dark Templar

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 nativ als Redewendungen haben, als sie jedes Mal selbst zu implementieren, herunterzuladen und zu verwenden. Fast alles kann in jeder dieser Sprachen implementiert werden. Die Frage ist - was bieten Ihnen die Sprachen von Haus aus?.

Also auf den ersten Blick (einige Argumente gelten für beide Sprachen) ...

C # ist darin besser als C++:

  • Es hat native Garbage-Collection.
  • Sie können die Signaturen von Klassenmethoden als freie Funktionen behandeln (d. H. Das statisch typisierte Zeigerargument this ignorieren) und so dynamischere und flexiblere Beziehungen zwischen Klassen erstellen. edit Wenn Sie nicht wissen, was dies bedeutet, weisen Sie einer void (*ptr)() - Variablen eine Mitgliedsmethode zu, die void zurückgibt und void akzeptiert . C # -Delegierte tragen den Zeiger this mit sich, aber der Benutzer muss sich nicht immer darum kümmern. Sie können einfach eine void() Methode einer beliebigen Klasse einem anderen void() Delegaten zuweisen.
  • Es hat eine riesige Standardbibliothek mit so vielen nützlichen Dingen, die gut implementiert und einfach zu bedienen sind.
  • Es ermöglicht sowohl verwaltete als auch native Codeblöcke.
  • Assembly-Versionierung behebt leicht DLL Höllenprobleme.
  • Sie können Klassen, Methoden und Felder so festlegen, dass sie Assembly-intern sind (dh, sie sind von überall in der DLL, in der sie deklariert sind, aber nicht von anderen Assemblys aus zugänglich) zugänglich.

C # ist besser als Java darin:

  • Anstelle von viel Rauschen (EJB, Implementierungen privater statischer Klassen usw.) erhalten Sie elegante und benutzerfreundliche native Konstrukte wie Eigenschaften und Ereignisse.
  • Sie haben echte Generika (nicht den schlechten Casting-Witz, der Java nennt Generika)), und Sie können darüber nachdenken.
  • Es unterstützt native Ressourcenverwaltungs-Idiome (die Anweisung using). Java 7 wird dies ebenfalls unterstützen, aber C # hat es schon viel länger.
  • Es wurden keine Ausnahmen überprüft :) (fraglich, ob dies gut oder schlecht ist)
  • Es ist tief in Windows integriert, wenn Sie dies wünschen.
  • Es verfügt über Lambdas und LINQ und unterstützt daher eine kleine Menge funktionaler Programmierung.
  • Es erlaubt sowohl generische Kovarianz als auch Kontravarianz explizit.
  • Es hat dynamische Variablen, wenn Sie sie wollen.
  • Bessere Aufzählungsunterstützung mit der Anweisung yield.
  • Hier 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 explizit einen Versuch machen/endlich). C++ hat automatische Zeiger, die für RAII großartig sind, und (wenn Sie wissen, was Sie tun) kann auch die Speicherbereinigung ersetzen.
  • Ich habe nichts über emulieren freie Funktionen gesagt. Wenn Sie beispielsweise mit einem Zeiger this auf ein Feld zugreifen und die Methode, die dies tut, an einen generischen Funktionszeiger binden müssen (dh nicht in derselben Klasse), gibt es einfach keine native Möglichkeit, dies zu tun . In C # erhalten Sie das kostenlos. Sie müssen nicht einmal wissen, wie es funktioniert.
  • Mit "Behandeln von Elementmethoden als freie Funktionen" meinte ich, dass Sie beispielsweise eine Elementmethode nicht nativ an eine Signatur für freie Funktionen binden können, da die Elementmethode "heimlich" den Zeiger this benötigt.
  • Die Anweisung using ist offensichtlich zusammen mit IDisposable-Wrappern ein hervorragendes Beispiel für RAII. Siehe dieser 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 Anweisung using 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 viel Speicher haben). Der Speicher wird nicht verloren gehen und Sie werden nicht viel Zeit für die Freigabe aufwenden. Darüber hinaus ist die Zuweisung auch schneller, da Sie nicht jedes Mal nur gelegentlich Speicher zuweisen. Das Aufrufen von new erhöht einfach einen Zeiger für das letzte Objekt.
  • "C # ist insofern schlimmer, als es eine Speicherbereinigung hat". Dies ist in der Tat subjektiv, aber wie ich oben sagte, ist die Speicherbereinigung für die modernste, typischste Anwendungsentwicklung ein verdammt großer Vorteil.
    In C++ können Sie Ihren Speicher entweder manuell mit new und delete verwalten, was empirisch immer hier und da zu Fehlern führt, oder (mit C++ 11). Sie können Auto-Zeiger nativ verwenden, aber denken Sie daran, dass sie dem Code sehr viel Rauschen hinzufügen. GC hat dort also immer noch einen Vorteil.
  • "Generika sind viel schwächer als Vorlagen" - ich weiß nur nicht, woher Sie das haben. Vorlagen mögen ihre Vorteile haben, aber meiner Erfahrung nach sind generische Parametertypprüfung, Kontravarianz und Kovarianz viel stärkere und elegantere Werkzeuge. Die Stärke von Vorlagen besteht darin, dass Sie ein wenig mit der Sprache spielen können, was cool sein kann, aber auch viele Kopfschmerzen verursacht, wenn Sie etwas debuggen möchten. Alles in allem haben Vorlagen ihre netten Funktionen, aber ich finde Generika praktischer und sauberer.
76
Yam Marcovic

Die Umgebung

.NET Framework- und Windows-Clients

Windows ist das dominierende Betriebssystem auf Client-Computern. Die besten GUI-Frameworks für Windows-Anwendungen sind Winforms und WPF zusammen mit . NET Framework. Die beste Programmiersprache für das . 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, verwenden diese wahrscheinlich eine Windows-zentrierte Umgebung mit einem Windows Server mit Active Directory. In einer solchen Umgebung ist es einfach, 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 Auswahl 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-Server, Active Directory, IIS und möglicherweise SQL Server arbeiten, ist C # die mit Abstand beste Sprache das . NET Framework.

Wenn Sie in einer Unix-Umgebung mit z. Webdienste, Java wäre meine Wahl. Und wenn Sie mit eingebetteten Systemen arbeiten oder in Hardwaregeräte integrieren müssen C++ wäre eine gute Wahl.

30
Jonas

C # und Java

C # ist eine sehr gute Sprache, wenn:

  • Sie möchten eine objektorientierte Allzweckentwicklung durchführen. Es ist eine klassische, statisch typisierte Sprache OOP).
  • Sie zielen nur auf Microsoft-Plattformen ab (es ist zu beachten, dass Microsoft effektiv Java) geklont hat, um C # zu erstellen, weil sie eine Java-ähnliche Sprache wollten, die Benutzer an Windows bindet. Sie hätten Java verwenden können, aber das hätte es den Leuten ermöglicht, Anwendungen einfach auf anderen Plattformen auszuführen ....)

C # als Sprache ist auf verschiedene Weise besser als Java (bessere Syntax für Eigenschaften, Werttypen, reifizierte Generika usw.). Ich bevorzuge C # als Sprache bis Java aber im großen Schema der Dinge 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 aller Sprachen Es ist schwer zu übertreiben, wie wichtig dies ist - vom Punkt der Erledigung der Dinge ist Java ist sehr effektiv.
  • Tools - Die Java Tools sind meiner Ansicht nach besser als das, was Sie in der .NET-Welt bekommen können. Beispielsweise ist Maven (sobald Sie es beherrschen!) Besonders beeindruckend.
  • Wartbarkeit - Java gibt es schon seit einiger Zeit und war in großen Unternehmen erfolgreich, gerade weil es relativ stabil ist und viel Aufwand in die Abwärtskompatibilität gesteckt wurde. Die einfache und leicht ausführliche Syntax auch hilft Java hier - es ist einfacher, Code zu lesen und zu pflegen, wenn der Code sehr klar und explizit 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 Sprachinnovation statt geschieht viel schneller als in Java oder C #.

Also Java vs. C # ist ein ziemlich enger Anruf und es kommt wirklich darauf an, ob Sie im Microsoft-Camp oder im Open Source/plattformübergreifenden Camp sein möchten.

Persönlich bevorzuge ich Java weil:

  • Das Bibliotheksökosystem ist meiner Ansicht nach viel wichtiger als die Tatsache, dass C # eine bessere Syntax als Java hat
  • Auf lange Sicht möchte ich, dass mein gesamter Code plattformübergreifend ist und auf großen Clustern billiger Linux-Computer in der Cloud ausgeführt werden kann.
  • Clojure ist meiner Meinung nach derzeit 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 es aus folgenden Gründen nicht für die allgemeine Anwendungsentwicklung empfehlen:

  • Speicherverwaltung - Für die meisten allgemeinen Programmierzwecke möchten Sie heutzutage keinen eigenen Speicher mehr verwalten. Die Speicherbereinigung in C # oder Java ist für Ihre Produktivität und Vernunft viel besser als alle expliziten Speicherverwaltungstechniken, die Sie in C/C++ verwenden müssen
  • Komplexität - Insbesondere C++ ist eine äußerst komplexe Sprache. Das Mastering dauert lange und der Code selbst kann auch teuflisch komplex sein. (C++ - Vorlagen sind zum Beispiel besonders haarig ....)
  • Produktivität - Die meiste Zeit und bei sonst gleichen Bedingungen 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 Spezialdomänen, 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 sind für weniger anspruchsvolle/Gelegenheitsspiele vollkommen in Ordnung).
  • Hochleistungsrechnen - Optimiertes C/C++ ist wahrscheinlich der beste Weg, um sehr leistungsfähigen Code zu erstellen. Für die meisten Anwendungen ist diese Optimierungsstufe nicht die Mühe wert, aber in bestimmten Bereichen kann sie äußerst wertvoll sein (z. B. Hochfrequenzhandel).
  • Hardwarezugriff - Sie benötigen direkten Zugriff auf die Hardware (z. B. für ein eingebettetes 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.

15
mikera
I heard that syntactically they are almost the same.

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

C # ist weitaus besser als Java. Betrachten Sie ihre generische und funktionale Programmierunterstützung - C # ist Java weit voraus. Ganz zu schweigen von Überlastungen der Bediener und anderen guten Dingen - C # ist weitaus besser ausgestattet. Es gibt keine Möglichkeit, dass Java möglicherweise als besser als C # angesehen werden könnte.

C++ und C # ist eher ein Wettbewerb. C++ hat ein unglaublich nerviges archaisches Kompilierungsmodell und eine Menge Legacy Krankheiten von C, aber seine Vorlagen sind weitaus leistungsfähiger als Generika, und seine Ansätze zur Ressourcenverwaltung sind im Allgemeinen viel flexibler und leistungsfähiger, als using ist ein vollständiger Fehler und wird schneller ausgeführt.

13
DeadMG

Gut C# hat einige nette integrierte Funktionen wie LINQ und Delegaten. Es wird das Beste aus beiden Welten - Java und C++. Schauen Sie hier für einen vollständigen Vergleich.

Aber ich mag die Java Welt besser - viel mehr Open Source Frameworks und sie läuft auf jeder Plattform. Und erzähl mir nichts über Mono - es ist keine zuverlässige Option.

7
Petar Minchev

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

C # bietet Funktionen, die Java fehlt, z. B. direkte Unterstützung für bestimmte Programmiersprachen wie Eigenschaften, funktionalen Programmierstil usw.). C # hat einen höheren Abstraktionsgrad als C++, was von Vorteil ist, wenn Entwicklungszeit ist wichtiger als Programmgeschwindigkeit.

Persönlich bevorzuge ich immer noch die Welten Java/C++. Wie Petar Minchev sagte, Java hat mehr Open-Source-Frameworks und -Anwendungen, es läuft überall, ist weniger C++ hat ähnliche Vorteile, obwohl Code häufig Anpassungen von einer Plattform zur anderen erfordert. Da ich lieber unter Linux entwickle und meines Wissens C # unter Linux nicht vollständig entwickeln kann, kann ich Ich habe mich nie wirklich für C # interessiert, 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 Betriebssystemmarkt und C # bietet viele Beschäftigungsmöglichkeiten. Daher verwenden IMO viele Entwickler C #, da es nicht nur eine funktionsreiche Sprache ist, sondern auch eine gute Investition ist.

3
Giorgio

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

Sie haben vergessen, andere Dinge einzuschließen, wie die "Umgebung", mit der Sie arbeiten werden.

  1. Arbeiten Sie nur für Windows O.S., müssen aber nicht auf niedrigem Niveau sein und über viel Speicher und andere Ressourcen verfügen?

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

  2. Wirst du nur für Windows arbeiten, musst aber nicht auf niedrigem Niveau sein, ABER hast du nicht viele Ressourcen?

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

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

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

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

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

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

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

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

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

Nur meine 2 Cent.

3
umlcat

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

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

1
Satyajit

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

C # ist besser als C++, weil:

Header-Dateien entfallen, was sich in großer Einfachheit niederschlägt.

C # ist besser als Java weil:

Es unterstützt sowohl benutzerdefinierte Typen vom Referenztyp (Klasse) als auch vom Werttyp (Struktur), die, wenn Sie wissen, was Sie tun, erhebliche Leistungsvorteile bringen können.

Es unterstützt Delegaten, die wie Schnittstellen mit einer Methode aussehen, und vereinfacht so die Codierung häufig vorkommender Konstrukte, die Objekte mit einer Methode enthalten.

1
Mike Nakis

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 fallen nicht unter den Standard 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 praktisch an Microsoft Windows und .Net gebunden, solange Sie die Sprache verwenden. Wenn Sie nach Fähigkeiten suchen, die Sie auf dem mobilen Markt einsetzen können, schauen Sie am besten in eine andere Sprache.

Java funktioniert, hat aber viel Overhead, was teilweise auf Funktionen wie die Speicherbereinigung zurückzuführen ist. Java ist auch nicht durch ISO/IEC standardisiert, daher haben Sie keine Garantie, wenn Sie Plattformen und Versionen von Java wechseln, nur die besten Absichten von Sun/Oracle. Wenn Sie schließlich planen, mit Android zu arbeiten, Dies ist 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, sodass 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 tun dies seit vielen Jahren. Apple verwendet Objective C für alles. Wenn Sie also auf Apple abzielen möchten, empfehlen wir Ihnen, dies stattdessen zu versuchen.

Wenn Sie sehen, dass Sie Windows irgendwann hinter sich lassen, würde ich empfehlen, sowohl C/C++ als auch Java - beide sind derzeit marktfähig) zu lernen.

1
T.J.

In Bezug auf C++ vs C # (da ich nicht genug Java beherrsche) fehlt mir hier die Möglichkeit, unter Windows auf Low-Level-Inhalte zuzugreifen. Beispielsweise können Sie (noch) keinen nativen Anzeigetreiber in C # entwickeln, dies jedoch mit C++. Dies macht C++ nicht besser. Ich sehe C++ gegen C # als Assembly gegen C.

C # ist meiner Ansicht nach viel effizienter, wenn man sich die Zeit ansieht, die für die tatsächliche Implementierung einer Funktion erforderlich ist. Der Leistungsverlust der .Net-Laufzeit ist für 99% der entwickelten Anwendungen vernachlässigbar. Es kann von Bedeutung sein, wenn Sie eine enge Schleife ausführen, ja auf jeden Fall, aber die meiste Zeit ist eine Anwendung inaktiv und wartet auf jede Art von Eingabe, Signal oder Interrupt (Festplatten-E/A, Tastenklick, Netzwerk, Abschluss der Animation). .

Die CLR-Bibliothek mit all seinen 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. Das Auffinden einer Methodenfunktion war im gesamten SDK logisch, was bei Visual Basic 5 ernsthaft fehlerhaft war. Dies hat ihnen bei der Übernahme der Bibliothek enorm geholfen. Nach dem Erlernen der Syntax einer Sprache ist das Erlernen einer neuen Bibliothek wichtig, um ein gutes Verständnis für ein SDK zu erlangen. Es erspart Ihnen die Neuerfindung des Rades.

0