Quels sont les avantages de faire du développement 100% géré en utilisant C ++ / CLI?

Quels sont les avantages (la liste des inconvénients possibles est enfin) de faire du développement 100% géré en utilisant C ++ / CLI (c’est-à-dire, comstackr avec / clr: safe qui “génère … des assemblys, comme ceux écrits en … C #” )? En particulier lorsque la compatibilité avec C # (remarque C ++ / CLI: Avantages par rapport à C # et Y at-il un avantage à utiliser C ++ / CLI par rapport au C ++ standard ou C #? Concerne principalement l’interopérabilité managée / non gérée)

Par exemple, en voici quelques unes qui me viennent à l’esprit:

  • Références de style C ++ pour les types gérés , moins élégantes que des références complètes non nullables, mais meilleures que rien ou utilisant une solution de contournement .

  • modèles qui sont plus puissants que les génériques

  • préprocesseur (cela peut être un inconvénient !, mais les macros peuvent être utiles pour la génération de code)

  • sémantique de stack pour les types de référence – appelant automatiquement IDisposable :: Dispose ()

  • implémentation plus facile de Dispose () via le destructeur C ++

C # 3.0 a ajouté des propriétés implémentées automatiquement, de sorte que ce n’est plus un avantage C ++ / CLI.

En C ++ / CLI, vous pouvez définir des fonctions en dehors des classes. Vous ne pouvez pas le faire en C #. Mais je ne sais pas si c’est un avantage

Je pense que le principal avantage est l’interopérabilité gérée / non gérée. L’écriture pure C ++ / CLI gérée (du moins pour moi) sans interopérabilité avec C # ou d’autres langages .Net semble manquer à l’essentiel. Oui, vous pouvez le faire, mais pourquoi le feriez-vous?

Si vous écrivez du code purement géré, pourquoi ne pas utiliser C #. Surtout (comme le dit nobugs) si VS2010 abandonne la prise en charge d’IntelliSense pour C ++ / CLI. De plus, dans VS2008, IntelliSense pour C ++ / CLI n’est pas aussi performant que C # IntelliSense; Du sharepoint vue des développeurs, il est donc plus facile de travailler / explorer / refactoriser en C # qu’en C ++ / CLI.

Si vous souhaitez énumérer certains des avantages C ++ énumérés, tels que le préprocesseur, la sémantique de stack et les modèles, pourquoi ne pas utiliser le C ++?

Bizarre, j’aime bien C ++ / CLI mais vous avez énuméré exactement les fonctionnalités qui me déplaisent Mes critiques:

  • D’accord. Mais l’utilisation accidentelle du chapeau est assez répandue, la valeur du type valeur étant encadrée sans avertissement. Il n’y a aucun moyen de diagnostiquer cette erreur.
  • Une puissance qui coûte cher, les modèles que vous écrivez ne sont utilisables dans aucun autre langage .NET. Au contraire, cela aggrave le problème d’exportation de modèles C ++. L’échec complet de STL / CLR mérite également d’être médité.
  • Euh, non.
  • C’était une erreur grave de l’OMI. Il est déjà difficile d’éviter les problèmes de boxe accidentelle, comme indiqué dans la première puce. La sémantique de stack empêche tout programmeur débutant de résoudre ce problème. C’était une décision de conception d’apaiser les programmeurs C ++, c’est bien, mais la déclaration using était une meilleure solution.
  • Je ne sais pas comment c’est plus facile. L’appel de GC.SuppressFinalize () est automatique, c’est tout. Il est très rare que quelqu’un écrive un finaliseur, mais vous ne pouvez pas empêcher le code généré automatiquement de passer l’appel. C’est inefficace et une violation du principe “vous ne payez pas pour ce que vous n’utilisez pas”. Ajoutez à cela que l’écriture du destructeur force également la génération automatique d’un finaliseur par défaut. Celui que vous n’utiliseriez jamais et que vous ne voudriez pas utiliser si vous avez oublié ou omis d’utiliser le destructeur.

Eh bien, tout cela est peut-être très subjectif. Le coup de grâce vient avec VS2010, il sera livré sans le support IntelliSense pour C ++ / CLI.

Comme d’autres ici, je ne peux penser à aucun cas général dans lequel un avantage clair existe. C’est pourquoi je me suis tourné vers les avantages situationnels: existe-t-il des cas où il existe un avantage dans un scénario particulier?

Avantage: Tirez parti des compétences C ++ du personnel technique dans un scénario de prototypage rapide.

Laissez-moi élaborer …

J’ai pas mal travaillé avec des scientifiques et des ingénieurs (non spécialistes du logiciel) qui ne sont pas des programmeurs qualifiés. Un grand nombre de ces personnes utilisent C ++ pour développer des modules spécifiques impliquant une physique / mathématiques haut de gamme. Si un scénario .NET pur est requirejs dans un scénario de prototypage rapide et que les compétences du scientifique / ingénieur responsable du module sont en C ++, je lui apprendrais une petite quantité de syntaxe supplémentaire ( public ref , ^ and % et gcnew ) et demandez-leur de programmer leur module en tant que DLL C ++ / CLI gérée à 100%.

Je reconnais qu’il y a tout un tas de réponses possibles “Oui, mais …”, mais je pense que tirer parti de l’ensemble des compétences C ++ du personnel technique est un avantage possible de C ++ / CLI.

Je suis d’accord sur ce que vous avez mentionné et, à titre d’exemple d’utilisation du préprocesseur, nous vous invitons à: Augmenter la bibliothèque de préprocesseur pour générer un ensemble de types basés sur une liste de types de base, tels que PointI32, PointF32, etc. en C ++ / CLI.

Vous pouvez avoir des énumérations et des delegates en tant que contraintes génériques en C ++ / CLI, mais pas en C #.

https://connect.microsoft.com/VisualStudio/feedback/details/386194/allow-enum-as-generic-constraint-in-c

Il existe une bibliothèque pour simuler ces contraintes en C #.

http://code.google.com/p/unconstrained-melody/

On pourrait imaginer les exigences suivantes pour un produit hypothétique:

  1. Mise sur le marché rapide sous Windows
  2. Déploiement éventuel sur des plateformes autres que Windows
  3. Ne doit pas compter sur Mono pour non-Windows

Dans un tel scénario, utiliser par exemple C # pour 1 vous empêcherait de réécrire sur 2 et 3. Ainsi, on pourrait développer en C ++ / CLI, muni de macros et de modèles de modèles pour ressembler autant que possible au C ++ ordinaire, pour atteindre le critère 1, puis pour appliquer le modèle 2, il faudrait (a) réimplémenter lesdits modèles et modèles mapper sur pukka C ++ et (b) implémenter les classes de framework .NET utilisées dans pukka C ++. Notez que (a) et (b) pourraient être réutilisés à l’avenir une fois fait une fois.

L’objection la plus évidente serait “bien pourquoi ne pas faire le tout en C ++ natif alors?”; Eh bien, peut-être y a-t-il beaucoup de bonnes choses dans la vaste bibliothèque de classes .NET que vous souhaitez utiliser pour arriver sur le marché.

J’admets que tout est un peu ténu, donc je doute fort que cela ait jamais été fait, mais ce serait une chose amusante d’essayer!