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

46

C # semble être populaire ces jours-ci. J'ai entendu dire que sa syntaxe est presque identique à celle de Java. Java et C ++ existent depuis plus longtemps. Pour quelles raisons devrais-je choisir C # plutôt que Java et C ++?

Templier noir
la source
16
Comme écrit, la question était un exemple classique de non constructif "quelle langue est la meilleure?" des questions qui sont hors sujet ici. J'ai essayé de le rendre plus constructif avec un montage car il contenait de bonnes réponses bien pensées. Gardez toutefois à l’esprit la FAQ et ce billet de blog lorsque vous posez des questions de cette nature.
Adam Lear
Permettez-moi d'ajouter des éléments plus incisifs. .NET possède un DOM bien défini ( par exemple, CodeDOM ) pour son langage et par conséquent, générer dynamiquement des choses au moment de l’exécution est beaucoup plus simple et plus efficace. Cela peut également être utile en tant que capacité infrastructurelle. En outre, le système de types a une correspondance 1 pour 1 avec tous les types W3 natifs. À la base, W3 et d'autres interops ont été intégrés à la langue dès le début. Pour d'autres langues, ces préoccupations ont été corrigées et leur posent de nombreux défis. En outre, si vous interagissez avec de nombreux langages et / ou protocoles, alors .NET est également très puissant
JoeGeeky Le
5
Hey, JoeGeeky, ajoutez votre commentaire comme réponse à la question.
Anthony Mastrean
1
La vraie question est la suivante: pour quelles raisons devrais-je choisir Nemerle, F * et F # plutôt que C #? (c.-à-d. que les trois langues sont issues de la SEP et que toutes les trois sont meilleures)
mrsteve le
Je ne pense vraiment pas qu'une affirmation du genre "langage / plate-forme X comparé à un langage / plate-forme Y soit TOUJOURS meilleur" est valide et je pense aussi que pour tout X et Y, elle peut facilement être invalidée dans certains contextes. Quel est le point de cette question?
Shivan Dragon

Réponses:

76

La question devrait être "Quelle langue est la mieux adaptée au développement d'applications modernes et typiques?".

Edit: J'ai abordé certains des commentaires ci-dessous. Petite remarque: considérez que lorsque vous avez beaucoup d'éléments natifs, les idiomes sont une différence majeure par rapport à leur implémentation ou leur téléchargement et à leur utilisation personnelle à chaque fois. Presque tout peut être implémenté dans l'une de ces langues. La question est de savoir quelles langues vous fournissent nativement.

Donc, par coeur (certains arguments s'appliquent aux deux langues) ...

C # est meilleur que C ++ en ce sens que:

  • Il a la collecte des ordures native .
  • Il vous permet de traiter les signatures des méthodes de classe comme des fonctions libres (en ignorant l' thisargument du pointeur de type statique ), et donc de créer des relations plus dynamiques et flexibles entre les classes. éditez si vous ne savez pas ce que cela signifie, puis essayez d'affecter une méthode membre renvoyant void et acceptant void pour une void (*ptr)()variable. Les délégués C # portent le thispointeur avec eux, mais l'utilisateur ne doit pas toujours s'en soucier. Ils peuvent simplement assigner une void()méthode de n'importe quelle classe à un autre void()délégué.
  • Il possède une énorme bibliothèque standard avec tant de choses utiles, bien implémentées et faciles à utiliser.
  • Il permet les blocs de code gérés et natifs.
  • Le versionnage d'assemblage résout facilement les problèmes de l'enfer de la DLL.
  • Vous pouvez définir les classes, les méthodes et les champs sur l'assemblage (ce qui signifie qu'ils sont accessibles de n'importe où dans la DLL dans laquelle ils ont été déclarés, mais pas à partir d'autres assemblys).

C # est meilleur que Java en ce sens 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 Evénements.
  • Vous avez de vrais génériques (pas la mauvaise blague de casting que Java appelle génériques), et vous pouvez y réfléchir.
  • Il prend en charge les idiomes natifs de gestion des ressources (la usingdéclaration). Java 7 va également le supporter, mais C # l’a eu pendant longtemps.
  • Il n'a pas vérifié les 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 ainsi en charge une petite quantité de programmation fonctionnelle.
  • Il autorise explicitement la covariance générique et la contravariance.
  • Il a des variables dynamiques, si vous les voulez.
  • Meilleur support d'énumération, avec la yielddéclaration.
  • Il vous permet de définir de nouveaux types de valeur (ou non référencés).

Edit - Adressant les commentaires

  • Je n'ai pas dit que C ++ ne supportait pas RAII en natif. J'ai dit que Java ne l'avait pas (vous devez explicitement faire un essai / enfin). C ++ a des pointeurs automatiques qui sont excellents pour RAII et (si vous savez ce que vous faites) peuvent également remplacer la récupération de place.
  • Je n'ai rien dit sur l' émulation de fonctions libres. Mais par exemple, si vous devez accéder à un champ par un thispointeur et lier la méthode qui le fait à un pointeur de fonction générique (c'est-à-dire ne pas appartenir à la même classe), il n'y a tout simplement pas de moyen natif de le faire. En C #, vous obtenez le 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 de manière native une méthode membre à une signature de fonction libre, car la méthode membre "secrètement" a besoin du thispointeur.
  • La usingdéclaration, évidemment avec les wrappers IDisposable, est un excellent exemple de RAII. Voir ce lien . Considérez que vous n'avez pas besoin de RAII autant en C # qu'en C ++, car vous avez le GC. Pour les moments spécifiques où vous en avez besoin, vous pouvez utiliser explicitement la usingdéclaration. Un autre petit rappel: libérer de la mémoire est une procédure coûteuse. Les GC ont des avantages en termes de performances dans de nombreux cas (en particulier lorsque vous avez beaucoup de mémoire). La mémoire ne sera pas perdue et vous ne passerez pas beaucoup de temps à désallouer. De plus, l'allocation est également plus rapide, car vous n'allouez pas de la mémoire à chaque fois, mais seulement de temps en temps. L'appel newconsiste simplement à incrémenter un dernier pointeur d'objet.
  • "C # est pire en ce qu'il a un ramassage des ordures". Ceci est certes subjectif, mais comme je l’ai indiqué plus haut, pour la plupart des applications de développement modernes et typiques, le ramassage des ordures ménagères est un sacré avantage.
    En C ++, vous avez le choix entre gérer manuellement votre mémoire à l'aide de newet delete, ce qui mène toujours empiriquement à des erreurs ici ou là, ou (avec C ++ 11), vous pouvez utiliser des pointeurs automatiques de manière native, mais gardez à l'esprit qu'ils ajoutent des tas de bruit au code. Donc, GC a toujours un avantage là-bas.
  • "Les génériques sont beaucoup plus faibles que les modèles" - je ne sais tout simplement pas d'où vous venez. Les modèles ont peut-être leurs avantages, mais selon mon expérience, la vérification du type de paramètre générique, la contravariance et la covariance sont des outils beaucoup plus puissants et élégants. La force des modèles réside dans le fait 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 fonctionnalités intéressantes, mais je trouve les génériques plus pratiques et plus propres.
Yam Marcovic
la source
5
Et si vous voulez toujours un récupérateur de place pour C ++, vous pouvez en télécharger un .
fredoverflow
6
Une autre caractéristique importante de C # par rapport à Java, pour des raisons de performances, est la "struct", un type d'objet qui peut être stocké sur la pile (ou dans des registres de la CPU, dans des cas particuliers) ou incorporé dans d'autres objets de segment de mémoire. Ils sont souvent utilisés pour les petits objets avec 1 à 4 champs, tels que les paires de coordonnées X, Y.
Qwertie
2
@LokiAstari Mind expliquer? Tant que vous vous souviendrez de la désinscription des gestionnaires d'événements et de l'utilisation du modèle Dispose sur les classes contenant des wrappers natifs, tout ira bien. C'est beaucoup moins à connaître et à retenir que la gestion de la mémoire en C ++.
Yam Marcovic
2
-1 puisqu'il me manque les sections "C ++ est meilleur que C # en ce que ..." et "Java est meilleur que C # ...". Je ne pense pas que C # soit supérieur dans tous les domaines, donc une réponse sans ces deux sections manque probablement d’informations importantes.
Giorgio
30

L'environnement

Clients .NET Framework et Windows

Windows est le système d'exploitation dominant sur les ordinateurs clients. Winforms et WPF ainsi que .NET Framework sont les meilleures infrastructures graphiques pour les applications Windows . Le meilleur langage de programmation pour travailler avec .NET Framework et ses API est C # . Java n'est pas une alternative pour cela. Et C ++ est un langage ancien sans gestion automatique de la mémoire. C # est similaire au C ++ mais possède une gestion automatique de la mémoire et vous n’aurez pas à travailler avec des pointeurs, ce qui vous rend plus productif. C ++ peut toujours être la meilleure option dans certains cas, mais pas pour les applications de base de données à forte intensité de formulaire 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 moins d'investissement possible pour apprendre IIS pour la programmation serveur et Windows Server pour l'administration de base.

Active Directory et Windows Server

Si vous développez un logiciel qui va être déployé dans les réseaux d'entreprise, il est probable qu'ils utilisent un environnement centré Windows utilisant un serveur Windows avec Active Directory. Dans un tel environnement, il est plus facile d'intégrer et de déployer une solution conçue 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 à 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 le C ++ pour les systèmes embarqués sans beaucoup de dépendances.

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

Sommaire

L’environnement de votre logiciel est primordial pour le choix de C # . Si vous travaillez dans un environnement avec les clients Windows, serveurs Windows, Active Directory, IIS et peut - être SQL Server puis C # est la meilleure langue bien avec le .NET Framework .

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

Jonas
la source
3
Absolument - c’est pourquoi j’utilise C # pas vraiment pour une autre raison
Murph
Vous pouvez certainement utiliser .NET sur d'autres plates-formes via Mono, MonoTouch et MonoDroid, mais mes tests ont révélé que Mono était nettement plus lent que .NET pour Windows et que le Compact Framework de Microsoft est extrêmement lent sous Windows CE: codeproject.com/KB/cross -plateforme / BenchmarkCppVsDotNet.aspx ... bien sûr, WPF est uniquement disponible sur Windows (mais je ne l'aime pas quand même.)
Qwertie
Quelles dépendances voulez-vous dire par "Je choisirais le C ++ pour les systèmes embarqués où je ne compterai pas beaucoup de dépendances." Voulez-vous dire les bibliothèques java?
Puckl
@Puckl oui, mais surtout le jvm / jre.
Jonas
"Si vous travaillez dans un environnement Unix avec, par exemple, des services Web", il existe d'autres langages et structures pouvant être considérés: ruby, Python, node.js, etc.
MarkJ
15

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 un langage classique, POO typé statiquement.
  • Vous ne ciblez que les plates-formes Microsoft (rappelez-vous que Microsoft a effectivement cloné Java pour créer du C #, car ils voulaient un langage semblable à Java qui verrouillerait les utilisateurs sur Windows. Ils auraient pu utiliser Java, mais cela leur aurait permis d'exécuter facilement des applications sur. autres plateformes ....)

C # en tant que langage est plus agréable que Java à bien des égards (meilleure syntaxe pour les propriétés, les types de valeur, les génériques réifiés, etc.). Je préfère C # comme langue de Java , mais dans le grand schéma des choses qu'ils sont des langues assez similaires et conviennent pour des applications similaires.

Par ailleurs, Java présente également de grands avantages:

  • Grand é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 de surestimer l’importance de cette question. Pour ce faire, Java est très efficace.
  • Outils - À mon avis, les outils Java sont 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.
  • Facilité de maintenance - Java existe depuis un certain temps et a connu du succès dans les grandes entreprises précisément parce qu'il est relativement stable et que beaucoup d'efforts ont été consacrés à la compatibilité ascendante. La syntaxe simple et légèrement verbeuse aide également 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 propose d’étonnants nouveaux langages (Scala, Clojure, Groovy, etc.) qui constituent l’avenir de la plate-forme Java. C’est là que les innovations linguistiques se produisent en grande partie, beaucoup plus rapidement que ce n’est en Java ou en C #.

Donc, Java vs C # est un appel assez proche et il s’agit vraiment de savoir si vous voulez être dans le camp Microsoft ou dans le camp Open Source / multiplateforme.

Personnellement, je préfère Java car:

  • À mon avis, l'écosystème des bibliothèques est beaucoup plus important que le fait que C # ait une syntaxe plus agréable que Java
  • À long terme, je veux que tout mon code soit correctement multiplateforme et puisse fonctionner sur de gros clusters de machines Linux bon marché dans le cloud.
  • Clojure est le langage IMHO le plus prometteur du monde actuellement, et si je reste fidèle à la plate-forme JVM, je pourrai facilement transférer mon code et mes compétences dans Clojure au fil du temps.

C / C ++

C / C ++ est fondamentalement une bête totalement différente. Je ne le recommanderais pas aujourd'hui pour le développement d'applications à usage général pour les raisons suivantes:

  • Gestion de la mémoire - pour la plupart des programmes d’usage courant, vous ne voulez pas gérer votre propre mémoire. La récupération de place en C # ou en Java est bien meilleure pour votre productivité et votre santé mentale que toutes les techniques de gestion de mémoire explicites que vous devrez utiliser en C / C ++.
  • Complexité - C ++ en particulier est un langage extrêmement complexe. Il faut beaucoup de temps pour le maîtriser et le code lui-même peut être extrêmement complexe. (Les modèles C ++ par exemple sont particulièrement poilus ....)
  • Productivité - la plupart du temps et toutes choses égales par ailleurs, il vous faudra plus de temps pour faire avancer les choses en C / C ++.

Cependant, il s’agit sans aucun doute d’un excellent choix dans un certain nombre de domaines particuliers, notamment:

  • 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 conviennent parfaitement aux jeux moins exigeants / occasionnels).
  • Calcul hautes performances - C / C ++ optimisé est probablement le meilleur moyen de créer un code très hautes performances. Ce niveau d'optimisation n'est pas rentable pour la plupart des applications, mais dans certains domaines, il peut s'avérer extrêmement utile (trading haute fréquence, par exemple).
  • Accès au matériel - Vous devez avoir un accès direct au matériel (par exemple, pour un système intégré).

Le C / C ++ est donc un excellent choix si et seulement si vous vous concentrez sur l’un des domaines où il est particulièrement bien adapté.

Mikera
la source
1
Vous mentionnez Maven comme exemple de meilleurs outils pour Java. Je ne suis pas particulièrement familier avec cela, mais en regardant la documentation, Maven a plutôt l’apparence de l’outil de construction .Net natif MSBuild. Qu'est-ce qui rend Maven meilleur que MSBuild?
Kevin Cathcart
1
+! (juste parce que je n'ai qu'un seul vote): vous avez très bien expliqué pourquoi l'écosystème Java est meilleur et pourquoi il ne faut pas comparer uniquement la syntaxe C # vs Java. Java a plus et de meilleures bibliothèques et outils. Peu de choses se passent dans le langage Java lui-même, mais de nouveaux langages très intéressants apparaissent pour la JVM et sont (IMO) beaucoup plus intéressants que C #. Je ne connais pas Clojure mais je trouve la Scala très intéressante: conçue pour être OOP + FP dès le début.
Giorgio
2
pourquoi tout le monde pense que le code C ++ est plein de gestion manuelle de la mémoire. RAII signifie que vous n’avez presque jamais à allouer / libérer manuellement de la mémoire (c’est le moment où vous le faites, ce sont des langages comme C # qui vous seraient inutiles).
gbjbaanb
3
@gbjbaanb - probablement parce que RAII est inadéquat pour la gestion de mémoire à usage général. Il n’est en aucun cas équivalent en flexibilité à un système GC complet comme en Java ou en C #. Dès que vous dépassez les limites de RAII, vous revenez dans le territoire de la gestion de la mémoire manuelle.
Mikera
3
@mikera Je veux juste souligner qu'il y a pas mal de développement de langage sur la plateforme .NET également. Par exemple, F # est un langage fonctionnel soigné qui intègre en douceur le reste de .NET, et Python a récemment été porté sur .NET en tant que Iron Python (et possède également un bel IDE !).
ikh
13
I heard that syntactically they are almost the same.

Syntaxiquement? Qui donne un singe volant à propos de la syntaxe? La syntaxe n’est utile que pour une chose: permettre une migration plus rapide de langages syntaxiquement similaires. C'est ça.

C # est nettement 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, le C # est beaucoup mieux présenté. Il est impossible que Java soit considéré comme meilleur que C #.

C ++ et C # sont plus qu'un concours. C ++ a un modèle de compilation archaïque incroyablement ennuyeux et un tas de maladies héritées 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 souples et puissantes en général, tout comme usingun échec complet, et il est exécuté plus rapide.

DeadMG
la source
6
Je pense qu’il faut comparer les fonctionnalités linguistiques et la disponibilité d’une langue sur différentes plates-formes. Avec C #, on est bloqué avec Microsoft, avec Java, on ne l’est pas: c’est un gros avantage, du moins pour les développeurs UNIX / Linux. OOP + FP sont des fonctionnalités intéressantes, mais pourquoi ne pas se préoccuper de C # si vous pouvez utiliser Scala, qui fonctionne sur la JVM et peut s’interfacer avec du code Java hérité? Je n'apprendrais jamais un langage spécifique à une plate-forme à moins d'y être forcé.
Giorgio
2
@Giorgio: Le projet Mono existe. Mais deuxièmement, Microsoft s’occupe réellement de leur plate-forme: ils lui donnent régulièrement de grandes mises à niveau. Java n'a presque rien de nouveau. En outre, la question concerne C # vs Java, pas CLR vs JVM.
DeadMG
4
@DeadMG: Autant que je sache, je ne peux prendre aucun programme C # développé sous Windows et le construire avec Mono. Pas CLR vs JVM? La question est de savoir pourquoi les gens utilisent C # ou Java. Pour que les gens utilisent une langue, ils ont besoin d’un runtime et d’un système d’exploitation. Je ne discute pas du fait que C # a plus de fonctionnalités que Java, mais Java est beaucoup plus portable: c'est un facteur qui peut influencer l'adoption d'un langage. En fait, Java est toujours utilisé beaucoup plus souvent que C # même s’il manque certaines fonctionnalités avancées.
Giorgio
3
@Giorgio, vous pouvez utiliser n'importe quel programme C # et le construire avec Mono. Vous ne pouvez pas utiliser certaines bibliothèques (qui de toute façon ne font pas partie du langage C #). Et java n'est pas "beaucoup plus portable". Vous pouvez coder pour iOS en C #, mais pas en Java, par exemple.
SK-logic
2
@ Giogio, Mono est au moins aussi portable que JVM.
SK-logic
7

Eh bien C#a de belles fonctionnalités intégrées comme LINQet délégués. Il tire le meilleur des deux mondes - Javaet C++. Regardez ici pour une comparaison complète.

Mais j'aime Javamieux le monde: beaucoup plus de frameworks open source fonctionnant sur toutes les plateformes. Et ne me parlez pas de Mono- ce n'est pas une option fiable.

Petar Minchev
la source
9
+1: "Mais j'aime mieux le monde Java - beaucoup plus de frameworks open source et il fonctionne sur toutes les plateformes." Espérons que Oracle ne change pas cela!
Giorgio
15
Expliquez-vous que ce qui n’est pas "fiable" en Mono
SK-logic
2
@Petar Minchev, Ce n'est rien d'autre que votre faute. Vous devez suivre les consignes de portabilité et ne pas utiliser de bibliothèques non portables. Ainsi, toute application complexe fonctionnerait de manière fiable avec Mono. Des choses comme WPF ne seront jamais portées.
SK-logic
2
@Petar Minchev, il existe de nombreuses bibliothèques Java non portables. Vous devez toujours faire attention à la portabilité, peu importe la langue que vous utilisez. Et de toute façon, la question concerne les langues, pas les bibliothèques tierces.
SK-logic
3
@Petar Minchev, GTK # est portable. Utilisez-le plutôt.
SK-logic
3

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 une prise en charge directe de certains idiomes de programmation tels que 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 le disait Petar Minchev, Java dispose de plus de frameworks et d'applications open source, il fonctionne partout, est moins lié à un fournisseur et à un système d'exploitation particuliers. Le C ++ présente des avantages similaires, même si le code nécessite souvent des adaptations d'une plate-forme à une autre. Puisque je préfère développer sur Linux et, à ma connaissance, je ne peux pas avoir de C # à part entière sous Linux, je n’ai jamais eu un réel intérêt pour C # car mes besoins en programmation sont couverts par C, C ++, Java, Scala.

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

Giorgio
la source
"Je ne peux pas avoir de C # à part entière sous Linux" - Pourriez-vous élaborer? Voulez-vous dire que le framework .Net complet n'est pas disponible parce que je n'ai rencontré aucun problème avec le langage C # lui-même (ou F # d'ailleurs) sous Linux?
Wesley Wiser
@wawa: À ma connaissance, le framework .Net correspond au JDK, et le framework .Net n'est disponible que pour Windows alors que le JDK est disponible pour plusieurs systèmes d'exploitation. Si cela n’est pas correct, je peux modifier ma réponse (et changer mon opinion également).
Giorgio
1
Je pense qu'une analogie plus étroite serait la bibliothèque de classes de base du JDK. La BCL comprend des pièces normalisées et non normalisées. Le projet mono met en œuvre les pièces normalisées ainsi que la plupart des pièces non normalisées.
Wesley Wiser
@wawa: Merci pour l'information. J'envisage d'essayer C # avec Mono. Pourtant, j'ai toujours le sentiment que C # est beaucoup plus lié à Microsoft que Java à Oracle (ou à Sun dans le passé).
Giorgio
3

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

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

  1. Allez-vous travailler uniquement pour Windows, mais ne devez 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 nécessairement être de bas niveau, MAIS, ne dispose pas de beaucoup de ressources?

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

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

    Choisissez le framework Java et le langage de programmation Java.

  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 beaucoup d'opérations de bas niveau, comme le développement de pilotes?

    Plain C ou C ++ est utilisé pour plusieurs systèmes d'exploitation, avec des bibliothèques standard, en tant que framework.

Juste mes 2 cents.

Umlcat
la source
1
Je ne sais pas trop. Les téléphones intelligents sont très populaires de nos jours et, autant que je sache, tout en charge le C #, mais seul Android prend en charge Java.
svick
Delphi n'est pas morte? :)
šljaker
@ šljaker Non, mais ce n'est pas très populaire ces jours-ci.
Umlcat
1
@sick: C'est un mensonge. Outre Android, Java existe aussi sous iOS, Symbian, WinMo, Blackberry, Maemo et WebOS (c'est-à-dire tout ce qui compte ou qui compte encore; ne me lancez pas avec des plateformes encore plus petites). Android, Blackberry et Symbian prennent officiellement en charge Java comme option de développement. Avant, Sun supportait Java sur iOS, même si Apple ne le souhaitait pas. Java est le principal langage de développement sur les téléphones Android et Blackberry. Je ne peux pas en dire autant avec C #, AFAICT n’est officiellement supporté que par WinMo.
Lie Ryan
1

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

Java a tenté de supprimer certaines des faiblesses du C ++ (et de simplifier la vie des programmeurs pour les applications non temps réel et non critiques). C # étant le dernier venu à la soirée, il a évité certaines des faiblesses du langage Java. C # a fait beaucoup de progrès (car Microsoft en a le contrôle), alors que les avancées en Java ont été bloquées pendant une longue période en raison d'un conflit entre ses parties prenantes.

Satyajit
la source
1

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

C # est meilleur que C ++ parce que:

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

C # est meilleur que Java car:

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

Il prend en charge les délégués, qui sont comme des interfaces à une seule méthode, ce qui simplifie grandement le codage des constructions fréquentes impliquant des objets à une seule méthode.

Mike Nakis
la source
Pouvez-vous expliquer en quoi le fait d'avoir à la fois des types de type référence et type de valeur peut générer des avantages en termes de performances en C #?
Giorgio
Par exemple, si vous souhaitez avoir un tableau d'enregistrements, vous n'avez pas d'autre choix en Java que de décrire votre enregistrement à l'aide d'une classe. Votre tableau sera donc un tableau de références à une multitude d'objets alloués séparément. En C #, vous pouvez décrire votre enregistrement en utilisant une structure. Ainsi, votre tableau ne sera plus qu'une zone continue de mémoire contenant vos structures, comme en C.
Mike Nakis
Comme autre exemple, si vous souhaitez définir un nouveau petit type (un type qui pourrait s’inscrire dans un mot machine), vous n’avez pas à définir une nouvelle classe pour ce dernier; vous pouvez simplement en faire une structure, afin qu'il obéisse à la sémantique de la valeur. Passer de telles structures ne coûtera pas plus cher que de passer des références à des objets, mais vous aurez l'avantage de ne pas allouer, construire et ramasser des objets.
Mike Nakis
Je comprends. Les classes sont donc instanciées sur le tas et accessibles via des références tandis que les structures sont instanciées sur la pile (?)
Giorgio
Presque correct. La seule inexactitude dans cette instruction est qu'une structure sera trouvée sur le tas si elle est incorporée dans un autre objet ou si elle se trouve dans un tableau de structures. Et il sera également trouvé sur le tas s'il est jamais mis en boîte, de la même manière que les types de valeur sont en boîte en Java.
Mike Nakis
1

Vous devez choisir la langue la mieux adaptée à votre environnement 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 entièrement compatible de la langue pour d'autres systèmes. Par conséquent, votre fournisseur est verrouillé sur Microsoft Windows et .Net aussi longtemps que vous utilisez cette langue. Si vous recherchez des compétences à utiliser sur le marché de la téléphonie mobile, mieux vaut chercher une autre langue.

Java fonctionne, mais génère beaucoup de temps système, en partie à cause de fonctionnalités telles que le garbage collection. De plus, Java n’est pas normalisé par ISO / IEC, vous n’avez donc aucune garantie de changer de plate-forme ou de version de Java, mais uniquement les meilleures intentions de Sun / Oracle. Si vous envisagez de travailler avec Android, c'est vraiment la voie à suivre. La programmation d'Android est essentiellement Java, avec quelques modifications.

Le C ++ est normalisé et presque tous les compilateurs respectent la norme internationale. Vous avez donc un comportement garanti MAIS le langage ne vous protège pas. 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 plutôt.

Si vous vous voyez abandonner Windows à un moment ou à un autre, je vous conseillerais d'apprendre les langages C / C ++ et Java, tous deux commercialisables à l'heure actuelle.

TJ
la source
0

En ce qui concerne C ++ vs C # (comme je ne maîtrise pas suffisamment Java), il me manque ici la possibilité d’accéder à des fonctions de bas niveau sur Windows. Par exemple, vous ne pouvez pas (encore) développer un pilote d'affichage natif en C #, mais vous pouvez le faire avec C ++. Cela ne rend pas le C ++ meilleur. Je vois C ++ versus C # comme Assembly versus C.

À mon avis, C # est beaucoup plus efficace si l’on prend en compte le temps nécessaire pour mettre en œuvre 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 d'entrée-sortie, clic de bouton, réseau, animation terminée). .

La bibliothèque CLR avec toutes ses fonctions présente un autre gros avantage. Quand je formais C # aux développeurs débutants, la plupart d’entre eux ont dit qu’ils aimaient la convention de nommage logique des classes, des membres et des espaces de noms. Trouver une fonctionnalité de la méthode était logique dans le SDK, ce à quoi Visual Basic 5 était gravement défaillant. Cela les a énormément aidés dans l’adoption de la bibliothèque. Après avoir appris la syntaxe d'une langue, apprendre à apprendre une nouvelle bibliothèque est essentiel pour bien comprendre tout SDK. Cela vous évite de réinventer la roue.

Rob van der Veer
la source