web-dev-qa-db-fra.com

Pour quelles raisons devrais-je choisir C # plutôt que Java et C ++?

C # semble être populaire de nos jours. J'ai entendu que syntaxiquement, c'est presque la même chose que Java. Java et C++ existent depuis plus longtemps. Pour quelles raisons devrais-je choisir C # plutôt que Java et C++?

46
Dark Templar

La question devrait être "Quel langage est le mieux adapté au développement d'applications modernes et typiques?".

Edit: J'ai adressé certains des commentaires ci-dessous. Une petite remarque: considérez que lorsque vous avez beaucoup de choses nativement, comme idiomes, c'est une grande différence que de les implémenter ou de les télécharger et de les utiliser vous-même à chaque fois. Presque tout peut être implémenté dans n'importe laquelle de ces langues. La question est - ce que les langues vous fournissent nativement.

Donc du haut de ma tête (certains arguments s'appliquent aux deux langues) ...

C # est meilleur que C++ dans la mesure où:

  • Il a natif garbage-collection.
  • Il vous permet de traiter les signatures des méthodes de classe comme des fonctions libres (c'est-à-dire en ignorant l'argument de pointeur this statiquement typé), et donc de créer des relations plus dynamiques et flexibles entre les classes. modifier si vous ne savez pas ce que cela signifie, essayez d'attribuer une méthode membre retournant void et acceptant void à une variable void (*ptr)() . Les délégués C # portent le pointeur this avec eux, mais l'utilisateur n'a pas toujours à s'en soucier. Ils peuvent simplement affecter une méthode void() de n'importe quelle classe à tout autre délégué void().
  • Il a une énorme bibliothèque standard avec tellement de choses utiles qui sont bien implémentées et faciles à utiliser.
  • Il permet à la fois des blocs de code gérés et natifs.
  • Le versionnage de l'assembly résout facilement les problèmes d'enfer DLL.
  • Vous pouvez définir des classes, des méthodes et des champs pour être internes à l'assembly (ce qui signifie qu'ils sont accessibles de n'importe où dans le DLL dans lequel ils sont déclarés, mais pas à partir d'autres assemblys).

C # est meilleur que Java en ce que:

  • Au lieu de beaucoup de bruit (EJB, implémentations de classes statiques privées, etc.), vous obtenez des constructions natives élégantes et conviviales telles que Propriétés et Événements.
  • Vous avez de vrais génériques (pas la mauvaise blague de casting qui Java appelle des génériques), et vous pouvez y réfléchir.
  • Il prend en charge les idiomes natifs de gestion des ressources (l'instruction using). Java 7 va également supporter cela, mais C # l'a depuis bien plus longtemps.
  • Il n'a pas vérifié d'exceptions :) (discutable si c'est bon ou mauvais)
  • Il est profondément intégré à Windows, si c'est ce que vous voulez.
  • Il a Lambdas et LINQ, prenant donc en charge une petite quantité de programmation fonctionnelle.
  • Il permet explicitement la covariance et la contravariance génériques.
  • Il a des variables dynamiques, si vous le souhaitez.
  • Meilleure prise en charge de l'énumération, avec l'instruction yield.
  • Il vous permet de définir de nouveaux types de valeur (ou non référence).

Modifier - Adresser les commentaires

  • Je n'ai pas dit que C++ ne prend pas en charge RAII natif. J'ai dit Java ne l'a pas (vous devez explicitement faire un essai/enfin). C++ a des pointeurs automatiques qui sont parfaits pour RAII, et (si vous savez ce que vous faites) peut également remplacer la collecte des ordures.
  • Je n'ai rien dit sur émulation les fonctions libres. Mais par exemple, si vous devez accéder à un champ par un pointeur this et lier la méthode qui le fait à un pointeur de fonction générique (c'est-à-dire pas dans la même classe), il n'y a tout simplement pas de façon native de le faire . En C #, vous obtenez gratuitement. Vous n'avez même pas besoin de savoir comment cela fonctionne.
  • Par "traiter les méthodes membres comme des fonctions libres", je voulais dire que vous ne pouvez pas, par exemple, lier nativement une méthode membre à une signature de fonction libre, car la méthode membre a "secrètement" besoin du pointeur this.
  • L'instruction using, évidemment avec les wrappers IDisposable, est un excellent exemple de RAII. Voir ce lien . Considérez que vous n'avez pas autant besoin de RAII en C # qu'en C++, car vous avez le GC. Pour les moments spécifiques où vous en avez besoin, vous pouvez utiliser explicitement l'instruction using. Autre petit rappel: libérer de la mémoire est une procédure coûteuse. Les GC ont leur avantage de performance dans de nombreux cas (surtout lorsque vous avez beaucoup de mémoire). La mémoire ne sera pas divulguée et vous ne passerez pas beaucoup de temps à désallouer. De plus, l'allocation est également plus rapide, car vous n'allouez pas de mémoire à chaque fois, seulement de temps en temps. Appeler new revient simplement à incrémenter un dernier pointeur d'objet.
  • "C # est pire en ce qu'il a la collecte des ordures". C'est en effet subjectif, mais comme je l'ai dit en haut, pour la plupart des développements d'applications modernes et typiques, la collecte des ordures est un sacré avantage.
    En C++, vos choix sont soit de gérer manuellement votre mémoire en utilisant new et delete, ce qui conduit toujours empiriquement à des erreurs ici et là, ou (avec C++ 11) vous pouvez utiliser les pointeurs automatiques en natif, mais gardez à l'esprit qu'ils ajoutent beaucoup, beaucoup de bruit au code. Donc, GC a toujours un Edge là-bas.
  • "Les génériques sont bien plus faibles que les modèles" - je ne sais pas d'où vous tenez cela. Les modèles peuvent avoir leurs avantages, mais d'après mon expérience, les vérifications de type de paramètres génériques, la contravariance et la covariance sont des outils beaucoup plus puissants et élégants. La force des modèles est qu'ils vous permettent de jouer un peu avec la langue, ce qui peut être cool, mais provoque également beaucoup de maux de tête lorsque vous souhaitez déboguer quelque chose. Donc, dans l'ensemble, les modèles ont leurs belles fonctionnalités, mais je trouve les génériques plus pratiques et plus propres.
76
Yam Marcovic

L'environnement

Clients .NET Framework et Windows

Windows est le système d'exploitation dominant sur les ordinateurs clients. Les meilleurs cadres GUI pour les applications Windows sont Winforms et WPF avec . NET Framework. Le meilleur langage de programmation pour travailler avec . NET Framework et ses API est C #. Java n'est pas une alternative à cela. Et C++ est un langage plus ancien sans gestion automatique de la mémoire. C # est similaire à C++ mais a une gestion automatique de la mémoire et vous n'avez pas à travailler avec des pointeurs, ce qui vous rend plus productif. Le C++ peut toujours être la meilleure option dans certains cas, mais pas pour les applications de base de données gourmandes en formulaires qui sont courantes dans les entreprises.

IIS et Windows Server

Si vous avez l'habitude de travailler dans l'environnement Windows et avec C #, vous aurez besoin du moindre investissement pour apprendre IIS pour la programmation du serveur et Windows Server pour l'administration de base.

Active Directory et Windows Server

Si vous développez un logiciel qui sera déployé dans les réseaux d'entreprise, il est probable qu'ils utilisent un environnement centré sur Windows à l'aide d'un serveur Windows avec Active Directory. Dans un tel environnement, il est plus facile d'intégrer et de déployer une solution faite en C # et . NET Framework.

Personnellement, je suis un développeur Java, pas un développeur C #, mais je travaille avec le Web. Je passerais en C # si je développais des applications réseau pour le réseau Windows. Mais je préfère Java pour les serveurs Web basés sur Linux. Je choisirais C++ pour les systèmes embarqués où je ne ferais pas beaucoup de dépendances.

Oui, C # est un meilleur langage avec des fonctionnalités plus modernes que C++ et Java, mais c'est pas la chose la plus importante pour choisir C #.

Sommaire

L'environnement de votre logiciel est le plus important pour choisir C #. Si vous travaillez dans un environnement avec clients Windows, serveurs Windows, Active Directory, IIS et peut-être SQL Server alors C # est le meilleur langage avec le . NET Framework.

Si vous travaillez dans un environnement Unix avec par exemple services Web, Java serait mon choix. Et si vous travaillez avec des systèmes embarqués ou devez intégrer des périphériques matériels C++ serait un bon choix.

30
Jonas

C # et Java

C # est un très bon langage si:

  • Vous voulez faire du développement orienté objet à usage général. C'est une langue classique, typée OOP langue.
  • Vous ciblez uniquement les plates-formes Microsoft (il convient de rappeler que Microsoft a effectivement cloné Java pour créer C # parce qu'ils voulaient un langage de type Java qui enfermerait les gens dans Windows. Ils auraient pu utiliser Java, mais cela aurait permis aux gens d'exécuter facilement des applications sur d'autres plates-formes ....)

C # en tant que langage est plus agréable que Java de diverses manières (meilleure syntaxe pour les propriétés, types de valeur, génériques réifiés, etc.). Je préfère C # comme langage à Java mais dans le grand schéma des choses, ce sont des langages assez similaires et adaptés à des applications similaires.

D'un autre côté, Java a aussi de gros avantages:

  • Immense écosystème open source - les bibliothèques pour Java que vous pouvez obtenir gratuitement sont de loin les meilleures de toutes les langues Il est difficile d'exagérer l'importance de cela - du point de vue de faire avancer les choses, Java est très efficace.
  • Outils - les outils Java sont à mon avis meilleurs que ce que vous pouvez obtenir dans le monde .Net. Par exemple, Maven (une fois que vous l'avez maîtrisé!) Est particulièrement impressionnant.
  • Maintenabilité - Java existe depuis un certain temps et a réussi dans les grandes entreprises précisément parce qu'il est relativement stable et qu'il y a eu beaucoup d'efforts consacrés à la compatibilité descendante. La syntaxe simple et légèrement verbeuse également aide Java ici - il est plus facile de lire et de maintenir le code si le code est très clair et explicite.
  • Nouveaux langages - La JVM a de nouveaux langages incroyables (Scala, Clojure, Groovy, etc.) qui sont l'avenir de la plate-forme Java. C'est là que se passe une grande partie de l'innovation langagière, et c'est se passe beaucoup plus rapidement que dans Java ou C #.

Donc Java vs C # est un appel assez proche et cela revient vraiment à savoir si vous voulez être dans le camp Microsoft ou le camp Open Source/multiplateforme.

Personnellement, je préfère Java parce que:

  • L'écosystème des bibliothèques est à mon avis beaucoup plus important que le fait que C # possède une syntaxe plus agréable que Java
  • À long terme, je veux que tout mon code soit correctement multiplateforme et capable de fonctionner sur de gros clusters de machines Linux bon marché sur le cloud.
  • Clojure est à mon humble avis la langue la plus prometteuse au monde en ce moment, et si je m'en tiens à la plate-forme JVM, je serai en mesure de transférer facilement mon code et mes compétences dans Clojure au fil du temps.

C/C++

C/C++ est fondamentalement une bête complètement différente. Je ne le recommanderais pas pour le développement d'applications à usage général de nos jours pour les raisons suivantes:

  • Gestion de la mémoire - pour la plupart des programmes à usage général de nos jours, vous ne voulez pas gérer votre propre mémoire. Collecte des ordures en C # ou Java est beaucoup mieux pour votre productivité et votre santé mentale que n'importe quelle technique de gestion de mémoire explicite que vous devrez utiliser en C/C++
  • Complexité - C++ en particulier est un langage extrêmement complexe. Cela prend beaucoup de temps à maîtriser et le code lui-même peut également être diaboliquement complexe. (Les modèles C++ par exemple sont particulièrement poilus ....)
  • Productivité - la plupart du temps et toutes choses étant égales par ailleurs, il vous faudra plus de temps pour faire avancer les choses en C/C++.

Cependant, c'est sans aucun doute un excellent choix dans un certain nombre limité de domaines spéciaux, en particulier:

  • Systèmes d'exploitation - vous souhaiterez probablement utiliser C/C++ si vous écrivez un système d'exploitation.
  • Développement de jeux - presque tous les meilleurs moteurs de jeux commerciaux sont C/C++. C'est toujours le meilleur choix si vous développez un titre AAA exigeant (C # et Java sont parfaitement adaptés aux jeux moins exigeants/occasionnels)
  • Calcul haute performance - C/C++ optimisé est probablement le meilleur moyen de créer du code à très haute performance. Pour la plupart des applications, ce niveau d'optimisation ne vaut pas la peine, mais dans certains domaines, il peut être extrêmement précieux (trading à haute fréquence par exemple)
  • Accès matériel - Vous avez besoin d'un accès direct au matériel (par exemple pour un système embarqué)

Donc, fondamentalement, C/C++ est un excellent choix si et seulement si vous vous concentrez sur l'un des domaines où il est particulièrement bien adapté.

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

Syntaxiquement? Qui donne des singes volants sur la syntaxe? La syntaxe est bonne pour une seule chose: permettre une migration plus rapide à partir de langages syntaxiquement similaires. C'est ça.

C # est bien meilleur que Java. Considérez leur support de programmation générique et fonctionnel - C # est bien en avance sur Java. Sans parler des surcharges d'opérateurs, et d'autres bonnes choses - C # est largement mieux présenté. Il n'y a aucun moyen que Java pourrait être considéré comme meilleur que C #.

C++ et C # est plus un concours. C++ a un modèle de compilation archaïque incroyablement ennuyeux et un tas d'héritage maladies de C, mais ses modèles sont beaucoup plus puissants que les génériques, et ses approches de gestion des ressources sont beaucoup plus flexibles et puissantes en général, comme using est un échec complet et il s'exécute plus rapidement.

13
DeadMG

Bien C# a quelques fonctionnalités intégrées comme LINQ et les délégués. Il tire le meilleur parti des deux mondes - Java et C++. Regardez ici pour une comparaison complète.

Mais j'aime mieux le monde Java - beaucoup plus de frameworks open source et il fonctionne sur toutes les plateformes. Et ne me parlez pas de Mono - ce n'est pas une option fiable.

7
Petar Minchev

Selon certaines sources (voir par exemple http://www.indeed.com/jobtrends ) C # est toujours moins populaire que Java, et aussi populaire que C++.

C # fournit des fonctionnalités qui manquent Java, par exemple le support direct de certains idiomes de programmation comme les propriétés, le style de programmation fonctionnel, etc.). C # a un niveau d'abstraction plus élevé que C++, ce qui est un avantage lorsque le temps de développement est plus important que la vitesse du programme.

Personnellement, je préfère toujours les mondes Java/C++. Comme l'a dit Petar Minchev, Java a plus de frameworks et d'applications open source, il s'exécute partout, est moins lié à un fournisseur et à un système d'exploitation particuliers. C++ présente des avantages similaires, même si le code nécessite souvent des adaptations allant d'une plate-forme à une autre. Comme je préfère développer sous Linux et, à ma connaissance, je ne peux pas avoir un C # à part entière sous Linux, je jamais eu un réel intérêt pour C # car mes besoins de programmation sont couverts par C, C++, Java, Scala.

En revanche, pour de nombreux développeurs, être lié à un fournisseur particulier n'est pas un problème: Microsoft a une position dominante sur le marché des systèmes d'exploitation et C # offre de nombreuses opportunités d'emploi. Par conséquent, de nombreux développeurs de l'OMI adoptent C # car, en plus d'être un langage riche en fonctionnalités, c'est également un bon investissement.

3
Giorgio

Qu'en est-il de "Quel cadre de développement logiciel, qui inclut un langage de programmation", c'est mieux?

Vous avez oublié d'inclure d'autres éléments, comme "l'environnement" avec lequel vous allez travailler.

  1. Allez-vous travailler uniquement pour Windows O.S., mais ne doit pas être de bas niveau et avoir beaucoup de mémoire et d'autres ressources?

    Choisissez .NET comme framework sur Windows et utilisez C #.

  2. Allez-vous travailler uniquement pour Windows, mais ne doit pas être de bas niveau, MAIS, n'a pas beaucoup de ressources?

    Choisissez le framework Delphi (et le langage de programmation Delphi Object Pascal ou le langage de programmation Object Pascal Lazarus)

  3. Est votre application. nécessaire pour prendre en charge plusieurs plates-formes, comme un jeu, dans différents mobiles?

    Choisissez le Java Framework, et le Java langage de programmation.

  4. Est-ce Linux avec KDE comme interface graphique?

    Choisissez le framework QT, avec C++

  5. Est-ce Linux avec Gnome comme interface graphique?

    Choisissez le framework GObject/GLib, avec C++

  6. Allez-vous travailler avec de nombreuses opérations de bas niveau, comme le développement de pilotes?

    Le C ou C++ ordinaire est utilisé pour plusieurs systèmes d'exploitation, avec des bibliothèques standard, comme cadre.

Juste mes 2 cents.

3
umlcat

Si vous effectuez une recherche, vous risquez de tomber sur une discussion sur les meilleurs langages de programmation. Voici l'un des résultats de la recherche - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java still semble être la langue la plus populaire.

Java a essayé de supprimer certaines des lacunes de C++ (et de simplifier la vie des programmeurs pour les applications non en temps réel et non critiques). C # étant le dernier venu à la fête, a évité certaines des lacunes du Java. C # a fait beaucoup de progrès (car Microsoft a beaucoup de contrôle sur lui)) tandis que les progrès dans = Java a été bloqué pendant une période de temps considérable en raison d'un conflit entre ses parties prenantes.

1
Satyajit

Quelques choses qui n'ont pas déjà été mentionnées:

C # est meilleur que C++ car:

Il supprime les fichiers d'en-tête, ce qui se traduit par une grande simplicité.

C # est meilleur que Java parce que:

Il prend en charge à la fois les types définis par l'utilisateur de type référence (classe) et de type valeur (struct) qui, si vous savez ce que vous faites, peuvent générer des avantages de performances significatifs.

Il prend en charge les délégués, qui sont comme des interfaces à méthode unique, simplifiant ainsi considérablement le codage des constructions fréquentes qui impliquent des objets à méthode unique.

1
Mike Nakis

Vous devez choisir la meilleure langue pour votre environnement attendu et votre expertise.

Choisissez C # si vous travaillez dans un environnement Microsoft uniquement. Alors que C # est normalisé selon ISO/IEC 23270: 2003, la version de Microsoft reste la seule implémentation complète. Plusieurs parties clés du langage ne sont pas couvertes par la norme et sont donc soumises aux brevets de Microsoft. Personne d'autre n'implémentera une version complètement compatible de la langue pour les autres systèmes, donc en fait, vous êtes verrouillé par Microsoft Windows et .Net pour le fournisseur tant que vous utilisez la langue. Si vous recherchez des compétences à utiliser sur le marché mobile, le mieux est de chercher dans une autre langue.

Java fonctionne, mais a beaucoup de frais généraux, en partie en raison de fonctionnalités telles que la récupération de place. Java n'est pas non plus normalisé par ISO/IEC, vous n'avez donc aucune garantie si vous changez de plate-forme et de version de Java, uniquement les meilleures intentions de Sun/Oracle. Si vous prévoyez de travailler avec Android, c'est définitivement la voie à suivre. La programmation d'Android est essentiellement Java, avec quelques modifications.

C++ est standardisé et presque tous les compilateurs suivent la norme internationale, vous avez donc un comportement garanti MAIS le langage ne vous protège pas de vous-même. Vous devez effectuer vous-même le nettoyage et la vérification du débordement. Ce n'est pas difficile. Les programmeurs C/C++ le font depuis de nombreuses années. Apple utilise Objective C pour tout, donc si vous voulez viser Apple, je vous recommande d'essayer à la place.

Si vous vous voyez laisser Windows derrière vous à un moment donné, je vous suggère d'apprendre à la fois C/C++ et Java - qui sont tous deux commercialisables à l'heure actuelle.

1
T.J.

En ce qui concerne C++ vs C # (comme je ne suis pas assez compétent en Java), ce qui me manque ici, c'est la possibilité d'accéder à des trucs de bas niveau sur Windows. Par exemple, vous ne pouvez pas développer un pilote d'affichage natif en C # (encore), mais vous pouvez le faire avec C++. Cela n'améliore pas le C++. Je vois C++ contre C # comme Assembly contre C.

C # est à mon avis beaucoup plus efficace si vous regardez le temps qu'il faut pour implémenter réellement une fonctionnalité. La pénalité de performance du runtime .Net est négligeable pour 99% des applications développées. Cela peut être important si vous exécutez une boucle serrée, oui, bien sûr, mais la plupart du temps, une application est inactive, en attente de tout type d'entrée, de signal ou d'interruption (disque IO, clic de bouton, réseau, achèvement de l'animation) .

La bibliothèque CLR avec toutes ses fonctions présente un autre gros avantage. Lorsque j'ai formé C # à des développeurs juniors, la plupart d'entre eux ont dit qu'ils aimaient la convention d'appellation logique des classes, des membres et des espaces de noms. Trouver une fonctionnalité de méthode était logique à travers le SDK, quelque chose que Visual Basic 5 était sérieusement défectueux. Cela les a énormément aidés à adopter la bibliothèque. Après avoir appris la syntaxe d'un langage, apprendre à apprendre une nouvelle bibliothèque est important pour bien comprendre n'importe quel SDK. Cela vous évite de réinventer la roue.

0
Rob van der Veer