8
votes

Quels sont les avantages de faire du développement géré à 100% à l'aide de C ++ / CLI?

Quels sont les avantages (la liste des inconvénients possibles est longhâte) de faire 100% géré Développement à l'aide de C ++ / CLI (c'est-à-dire, compilez avec / CLR: Coffre-fort qui" génère ... des assemblages, comme ceux écrits dans ... C # ")? Surtout quand comporter C # (note C ++ / CLI: Avantages sur C # et Y a-t-il un avantage à l'utilisation de C ++ / CLI sur la norme C ++ ou C #? sont surtout à propos de Interop géant / non géré).

Par exemple, voici quelques-uns sur le dessus de ma tête:


7 Réponses :


5
votes

impair, j'aime C ++ / CLI, mais vous avez répertorié ses fonctionnalités que je n'aime pas. Mes critiques:

  • d'accord. Mais l'utilisation accidentelle du chapeau est assez répandue, obtenant la valeur de la valeur de valeur en boîte sans avertissement. Il n'y a aucun moyen de diagnostiquer cette erreur.
  • puissance qui vient à un prix élevé, les modèles que vous écrivez ne sont utilisables dans aucune autre langue .NET. Si quelque chose, il s'aggrave du problème d'exportation de modèle C ++. La défaillance complète de STL / CLR vaut la peine d'être réfléchi.
  • erm, no.
  • C'était imo une grave erreur. Il est déjà difficile d'éviter des problèmes de boxe accidentelle, comme indiqué dans la première balle. Stack Sémantics le rend sérieusement difficile pour tout programmateur de départ pour trier cela. C'était une décision de conception pour apaiser les programmeurs C ++, c'est bon, mais l'utilisation de l'utilisation était une meilleure solution.
  • Je ne sais pas comment il est plus facile. L'appel GC.SuppressFinalize () est automatique, c'est tout. Il est très rare pour personne d'écrire un finisseur, mais vous ne pouvez pas éviter le code généré automatiquement de faire l'appel. C'est inefficace et une violation des «Vous ne payez pas pour ce que vous n'utilisez pas» principe. Ajouter à cela que la rédaction du destructeur oblige également un finaliseur par défaut à être généré automatiquement. On ne voudrais jamais utiliser et ne voudriez pas être utilisé si vous avez oublié ou omis d'utiliser le destructeur.

    Eh bien, c'est tout très subjectif peut-être. Le knell deathien viendra avec VS2010, il sera expédié sans support IntelliSense pour C ++ / CLI.


6 commentaires

Où entendez-vous que le VS2010 déposera Intellisense pour C ++? Une recherche rapide dans Google pour "VS2010 Intellisense C ++" revient sans aucune amélioration de IntelliSense. -1 jusqu'à ce que vous puissiez prouver votre déclaration.


@Russ - pas pour C ++, pour C ++ / CLI, comme indiqué clairement dans mon message. Link: CodeGuru.com/forum/showthread.php?t=477959 Gimme mes points de retour, Dammit!


Bien que je pense que j'aurais préféré quelque chose de plus récent. ( connect.microsoft.com/visualstudio/feedback/... ). Je vais le prendre. +1 pour fournir des preuves.


Argh, débordement de pile dit que mon vote est trop vieux pour moi, à moins que la réponse est modifiée. (+1 sur votre commentaire avec la preuve)


Dans la normale C ++, si un constructeur jette, tout objet qui a été construit dans le cadre de celui-ci aura leurs destructeurs. Est-ce que c ++ / cli fait ça? Si tel est le cas, cela semblerait être un avantage sur C # qui peut parfois rendre il très difficile de construire des hiérarchies de classe qui ne fuient pas quand un constructeur jette.


Cette réponse m'a éclaté à certaines des négatifs de C ++ rarement rarement rarement. Je voudrais suggérer une modification qui apporterait la mise au point de la question dans la réponse qui facilite beaucoup la tâche. Pour lire sans faire défiler le haut de la page à chaque point de balle. En outre, je pense que cela pourrait être une bonne idée d'élaborer le point de préprocesseur; Il est peut-être comparer la puissance expressive du langage de prétraitement (ou plutôt un manque de) à d'autres langues de traitement de texte (par exemple PERL, pas que je recommanderais que la langue) pourrait avoir un sens.



6
votes

Je pense que le plus grand avantage est le plus grand avantage est géré / non géré. Écriture pure gérée C ++ / CLI (pour moi au moins) sans interoper avec C # ou d'autres langues .Net semble manquer le point entièrement. Ouais tu pourrais faire ça, mais pourquoi voudriez-vous.

Si vous allez écrire du code géré pur, pourquoi ne pas utiliser c #. Surtout (comme les Nobugs a déclaré) si VS2010 goutte la prise en charge IntelliSense pour C ++ / CLI. Également en VS2008, l'IntelliSense pour C ++ / CLI n'est pas aussi bon le C # IntelliSense; Donc, d'un point de vue du développeur, il est plus facile de travailler / explorer / refacteur en C # que c ++ / cli.

Si vous souhaitez que certains des avantages de C ++ vous listez comme le préprocesseur, la sémantique de la pile et les modèles, alors pourquoi ne pas utiliser C ++?


2 commentaires

C ++ / CLI est affreux pour tout sauf interop. Vous frappez le clou sur la tête avec le commentaire de l'utilisation de C # si vous vouliez écrire des assemblys gérés.


@Dan, je ne suis pas convaincu que ceux qui sont seuls suffisants pour balayer la facilité de développement et le meilleur soutien de l'IDE de C #



2
votes

Comme les autres ici, je ne peux penser à aucun cas général où il existe un avantage clair, alors ma pensée s'est tournée vers des avantages de la situation - existe-t-il des cas où il y a un avantage dans un scénario particulier?

avantage: Tirer parti de l'ensemble de compétences C ++ de personnel technique dans un scénario de prototypage rapide.

laissez-moi élaborer ...

J'ai travaillé un peu avec des scientifiques et des ingénieurs (non logiciels) qui ne sont pas des programmeurs formellement formés. Beaucoup de ces personnes utilisent C ++ pour développer des modules spécifiques impliquant une physique / mathématiques haut de gamme. Si un module PURE .NET est requis dans un scénario de prototypage rapide et que le jeu de compétences du scientifique / ingénieur responsable du module est C ++, je leur enseignerais une petite quantité de syntaxe supplémentaire ( ref , ^ et % et gcnew ) et faites-les de programmer leur module sous forme de dll C ++ / CLI géré 100%.

Je reconnais qu'il y a 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.


0 commentaires

1
votes

Je suis d'accord sur ce que vous avez mentionné et comme exemple de préprocesseur d'utilisation point à: Boost Prepprocessor Bibliothèque pour générer un ensemble de types basé sur une liste de types de base, par exemple POITI32, POINTF32, etc. dans C ++ / CLI


0 commentaires

3
votes

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


0 commentaires

0
votes

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

  1. Délai rapide sur Windows
  2. Déployer éventuel sur des plates-formes non-Windows
  3. ne doit pas compter sur mono pour les non-windows

    Dans un tel scénario, en utilisant, par exemple, c # pour 1 vous timie sur 2 et 3 sans réécriture. Ainsi, on pourrait se développer en C ++ / CLI, de manière appropriée avec des macros et des modèles de shenanigans afin de ressembler autant que possible C ++ que possible, de frapper le REQT 1, puis de frapper Reqt 2 il aurait besoin de (a) réemployer lesditives de macros et de modèles shenanigans Pour cartographier sur Pukka C ++ et (B) Mettre en œuvre les classes de framework .NET utilisées à Pukka C ++. Notez que (a) et (b) pourraient être réutilisés à l'avenir une fois effectué une fois.

    L'objection la plus évidente serait "bien pourquoi ne pas faire tout le tout dans natif c ++ alors?"; Bien peut-être qu'il y a beaucoup de bonnes choses dans la vaste bibliothèque de classe que vous souhaitez utiliser pour vous rendre au marché dès que possible.

    Tout un peu ténu, j'admets, alors je doute beaucoup cela ait été fait, mais ce serait une chose amusante à essayer!


0 commentaires

1
votes

Vous pouvez avoir des problèmes et des délégués en tant que contraintes génériques en C ++ / CLI, mais pas en C #.

https: // Connect.Microsoft.com/visualstudio/feedback/Détails/386194/allow-enum-as-Generic-constraint-in-c

Il y a une bibliothèque pour simuler ces contraintes dans C #.

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


0 commentaires