C ++. Net est-il largement utilisé?

25

Je suis un codeur C ++ par tradition. Au cours des 12 derniers mois, j'ai fait beaucoup de codage C #, et j'ai été agréablement surpris par l'approche pragmatique de C # (une fois que j'ai arrêté d'essayer de le coder comme s'il s'agissait de "C ++ avec garbage collection").

Nous avons récemment eu quelques diplômés et en aidant l'un d'entre eux, j'ai réalisé qu'elle utilisait .Net en C ++. Après lui avoir demandé pourquoi, elle a répondu que son manager lui avait dit "d'utiliser C ++". Mis à part un problème de communication évident, je suppose qu'elle utilisait .Net car c'est le seul framework auquel elle a été exposée.

Je suis ensuite tombé sur un ancien projet d'un développeur senior qui a également utilisé C ++ pour piloter un frontal Forms. Maintenant, cela aurait été écrit au moment où .Net est apparu pour la première fois, donc je suppose que c'était un exercice d'apprentissage de sa part pour jouer avec .Net. Ce n'était qu'une petite application utilitaire.

Ayant dû faire quelques modifications mineures dans cette application, il me semblait que l'utilisation de C ++ pour piloter .Net vous donne le pire des deux mondes. Pas de récupération de place ou de sécurité de la mémoire, mais pas non plus de réelles opportunités de vitesse / d'optimisation car vous avez affaire à un cadre géré.

Ma question est donc de savoir si les gens utilisent C ++ .Net pour tout grand code de production autonome (c'est-à-dire sans plomberie), et si oui, quelles sont vos raisons de le faire? J'admets librement que je ne me suis jamais plongé profondément dans les extensions C ++ .Net, je peux donc lui rendre un mauvais service.

GazTheDestroyer
la source

Réponses:

32

C ++. NET (ou, précisément, C ++ / CLI) n'ont la collecte des ordures, comme tout le reste qui fonctionne au sommet de .NET. Pour y parvenir tout en restant compatible avec C ++ proprement dit, il utilise la syntaxe et pour les pointeurs récupérés («sûrs»).^gcnew

C ++ / CLI est considéré comme une abomination par beaucoup, il est beaucoup plus désagréable de travailler avec C # ou C ++ proprement dit, et aussi plus compliqué que l'un ou l'autre (simplement parce qu'il apporte la complexité du C ++ lui-même à la table et ajoute ce qu'il faut pour travailler avec .NET au mix). L'apprentissage du C # porte généralement ses fruits même dans le cadre d'un seul projet de taille moyenne. Cependant, il peut faire une chose que ni C # ni C ++ natif ne peuvent faire: compiler C ++ existant avec .NET et le faire parler à d'autres composants .NET.

Par conséquent, cela n'a pas beaucoup de sens d'utiliser C ++ / CLI pour un projet à partir de zéro - tout ce qui est lié à .NET peut être fait en C #, avec une syntaxe beaucoup plus agréable et la sécurité supplémentaire de ne pas exposer raw pointeurs par défaut. Sa raison d'être la plus importante est le portage des bases de code existantes vers .NET. Une entreprise qui décide de commencer à utiliser .NET, mais qui ne veut pas (ou ne peut pas, en raison de contraintes de temps et de ressources) réécrire chaque logiciel qu'elle a produit jusqu'à présent, peut utiliser C ++ / CLI pour continuer à utiliser sa base de code existante avec seulement des changements minimes, puis réécrivez les composants de leur système en C # un par un. C'est du moins la théorie; Je ne l'ai jamais vu faire dans la pratique moi-même, donc je ne peux pas dire à quel point cela fonctionne.

Notez également que C # lui-même peut s'interfacer avec des bibliothèques natives, donc même si vous devez utiliser des bases de code C ++ existantes, vous n'avez pas nécessairement à les recompiler avec .NET: souvent, l'interfaçage avec elles via COM ou P / Invoke est la meilleure solution .

tdammers
la source
10
Veuillez noter que «l'interfaçage avec les bibliothèques natives» avec P / Invoke est limité aux dll avec des fonctions statiques, et COM est un problème en soi. Un wrapper en C ++ / CLR vous permet d'accéder proprement à un backend / projet natif de taille normale dans votre code C # avec très peu de limitations. Je ne l'utiliserais pas pour le développement, mais comme colle, c'est BEAUCOUP plus propre que P / Invoke et son marshalling.
Max
Appuyé - Et je pense que Microsoft a tacitement accepté, à en juger par la façon dont ils ont réaligné C ++ à sa juste place dans le développement natif.
Josh Greifer
2
Notez que le langage est en fait appelé C ++ / CLI, pas C ++. NET.
svick
@svick: Correct. Édité.
tdammers
1
@Max TBH Microsoft a tout rendu natif. Alors maintenant, vous n'avez plus besoin de C ++ / CLI, il n'est pas nécessaire d'écrire ces wrappers désagréables pour interfacer C # au code natif - assurez-vous simplement que ce sont des objets WinRT / COM et vous avez terminé.
gbjbaanb