Dans mon code, je le fais beaucoup:
myfunction (parameter p) { if(p == null) return; }
3 Réponses :
Ces messages ici A> et ici a beaucoup d'excellentes options. Edit: J'ai mal interprété votre message la première fois, pensant que vous jetais une erreur argumentation ou quelque chose, jusqu'à ce que je sois le commentaire de Jon Skeet. Je suggérerais certainement d'utiliser au moins une des nombreuses approches fournies dans les questions liées. P>
reproduisant l'une des réponses de John Feminella ici: P>
[Pure] public static double GetDistance(Point p1, Point p2) { CodeContract.RequiresAlways(p1 != null); CodeContract.RequiresAlways(p2 != null); // ... }
Il n'y a pas de codecontract.requiresalways () - au moins je ne vois pas une telle chose à vs2013 C #
C'est obsolète de nos jours, mais toujours documenté dans le code Guide de l'utilisateur des contrats
La syntaxe est la suivante:
Contract.Requires(p != null);
trébucha sur cette question lors de la recherche de contrats de code pour notre codeBase. Les réponses ici sont incomplètes. En affectant cela pour référence future.
Comment puis-je remplacer cela par un contrat de code? p> blockQuote>
Le code est assez simple. Remplacez votre chèque NULL d'exécution avec cette ligne. Cela lancera une exception du type
System.Diagnostics.contracts.ContractException code> (que vous ne pouvez apparemment pas attraper explicitement, à moins que vous ne attrapiez à toutes les exceptions; il n'est pas conçu pour être pris au moment de l'exécution). P> < Pré> xxx pré>
Je suis intéressé à déterminer si une null a été transmise et l'avoir attrapé par une vérification statique. P> blockQuote>
Vous pouvez utiliser le plugin Microsoft pour l'analyse statique du contrat de code, trouvé ici . P>
Je suis intéressé à avoir une exception sous contrat être lancée si NULL est transmis pendant notre test p> blockquote>
Utilisez ce qui suit, à partir de ci-dessus: p>
xxx pré> Alternativement, si vous souhaitez lancer une exception différente (telle qu'un
argumentnullexception code >) Vous pouvez effectuer ce qui suit: p>
xxx pré> Ceci nécessite cependant que le code contracte le code binaire, qui est inclus avec le Code Contract Plugin . P>
Pour la production, je veux sortir de la fonction. P> BlockQuote>
De ce que je comprends, la construction de votre projet en mode de sortie désactivera la vérification du contrat de code (bien que vous puissiez remplacer cela dans vos propriétés de votre projet). Donc oui, vous pouvez le faire. P>
CODE CODE Les contrats font cela du tout? Est-ce une bonne utilisation pour les contrats de code? P> blockQuote>
réponse courte - oui. p> p>
Pourquoi voudriez-vous éteindre efficacement les contrôles de sécurité lors de la course avec des données réelles? N'est-il pas tout aussi important (sinon plus) d'arrêter et d'abandonner tout ce que vous faites si votre code a des bugs dans la fabrication?
@Jon Skeet: Il y avait une récente coulée de pod .NET Rocks dans laquelle ils ont parlé à l'un des principaux designers des contrats de code de C # 4.0 et ont posé la même question. J'aimerais pouvoir l'expliquer aussi bien qu'avoir, mais j'ai bien peur que je n'aurais pas mal de mal. Il a fait un cas assez convaincant (lorsque vous avez une vérification sous contrat lors de l'exécution de toute façon) sur la raison pour laquelle les contrats de code étaient mieux dans l'ensemble.
@Neil: Je n'ai rien contre des contrats de code ... mais je les laisserais aussi dans la production.
@Jon Skeet: Vous voulez dire que vous quitteriez également des contrôles de sécurité? Je crois comprendre que les contrats peuvent servir à la fois des vérifications de sécurité et d'exprimer les valeurs autorisées des paramètres, ce que vous ne pouvez pas discerner à partir de la Singature seule, car la signature de la méthode ne peut pas vous dire si un paramètre ne peut pas être nul, ou plus grand que zeo, etc.
@Neil: Je laisserais les contrats actifs, de sorte qu'ils jettent une exception si vous avez transmis un argument invalide.
@Jon Skeet: Alors en effet, cela ne désactive pas les contrôles de sécurité? Je suis confus quant à ce que votre préoccupation était.
@Neil: Oui, je ne feriez pas i> désactiver les contrôles de sécurité. C'est pourquoi je demandais pourquoi l'OP serait I> les éteindre (simplement revenir au lieu de jeter une exception).
Je traite avec des nulls inattendus en production en prenant la sortie silencieuse de la boucle logique. La raison étant que plusieurs fois le programme peut continuer à courir bien, même si une null inattendue a été adoptée. Je conviens que dans la théorie, la meilleure chose à faire est de jeter une exception null (mes collègues développeurs me regardent comme si je suis fou quand Je dis cela). Cependant, dans la pratique, je ne veux pas être le programmeur qui a introduit le bogue critique parce que j'ai jeté une exception. Y a-t-il un meilleur moyen de gérer cela? Je suis ouvert aux idées ...
En réponse à Jon: Cela dépend de la question de savoir si vos données proviennent de sources externes ou non. Si tout votre code est CC'D et que le vérificateur statique passe à 100%, vous irez bien à désactiver au moment de l'exécution. Vous pouvez également laisser uniquement des contrats de surface publique activés, de sorte que les sources externes ne puissent pas casser vos conditions préalables. Cela signifie également qu'il est prudent de désactiver la vérification de l'exécution interne (non publique).