L'utilisation excessive de contrats de code ralentit le processus de compilation. Deuxièmement, les contrats de code font partie du mode de débogage uniquement. Et si je configure les contrats de code et que je compile toujours le code en mode release, est-ce que le contrat de code fonctionnera ? Je suppose que non, ce qui signifie que le développeur sera forcé de travailler en mode debug et que lorsque vous créez une configuration, vous la faites en mode release. Ai-je raison ?
Réponses
Trop de publicités?La compilation est un peu ralentie en raison du mode de fonctionnement des contrats de code. Il existe un réécrivain d'IL qui injecte du code dans vos méthodes sur la base des contrats que vous spécifiez. Cela se produit après que le compilateur C# a généré l'IL pour votre assemblage.
La différence de performance à l'exécution est assez faible et n'affectera pas votre code de façon notable. À moins que vous ne développiez un système de trading en temps réel, je ne m'en préoccuperais même pas.
Pour ce qui est de la désactivation des contrats de code en production, je préfère de loin la protection supplémentaire des contrats de code à une éventuelle erreur obscure. Une erreur dans le contrat de code vous dira exactement où et pourquoi le contrat a été violé, plutôt que d'avoir à creuser dans une pile d'appels profonde juste parce que des données erronées ont été transmises à 5 niveaux de l'arbre de la pile d'appels.
Si vous utilisez ou prévoyez d'utiliser Contract.Requires<TException>
et n'activez pas la fonction 'Runtime Contract Checking', vous obtiendrez un échec à l'exécution car le réécrivain IL doit être lié à l'utilisation des contrats de code. Vous devrez alors activer Runtime Contract Checking pour que cela fonctionne.
IMHO, l'utilisation de Contract.Requires<TException>()
est bien plus utile que Contract.Requires()
puisque vous avez le contrôle sur le type d'exception déclenchée.
EDIT : Une chose que j'ai oublié d'ajouter est que le réécrificateur d'IL est complètement indépendant du compilateur C# et qu'il n'y a aucune dépendance entre les deux.
Assumer les contrats de code de MS Devlab,
-
Compilation : Les outils de contrats activent après votre compilation. Il y a un réécrivain pour la vérification de l'exécution, et cela prend (un peu) de temps dans le cadre de votre compilation.
Le vérificateur statique s'exécute ensuite, mais en arrière-plan. Vous ne devez pas l'attendre, sauf si vous voulez voir les messages immédiatement. -
Comportement à l'exécution. Ce comportement est configurable en plusieurs étapes, depuis la désactivation complète (benchmark), Requiert uniquement / Requiert+Essure (release) jusqu'à la configuration complète (analyse / débogage).