C# - Que fait la méthode Assert ()? Est-il encore utile?

je suis en train de déboguer avec des breakpoints et je réalise l'appel d'assert? Je croyais que c'était seulement pour les tests unitaires. Qu'est-ce qu'il fait de plus que breakpoint? Puisque je peux faire du breakpoint, Pourquoi devrais-je utiliser Assert?

125
demandé sur PeterVermont 2008-10-02 21:24:28

9 réponses

dans une compilation de débogage, Assert prend une condition booléenne comme paramètre, et affiche la boîte de dialogue erreur si la condition est fausse. Le programme se déroule sans interruption si la condition est vraie.

si vous compilez en version, tous Debug.Assert 's sont automatiquement exclus.

165
répondu Patrick Desjardins 2017-05-21 09:58:15

À Partir De Code Complete

8 Programmation Défensive

8.2 Affirmations

une assertion est un code qui est utilisé pendant le développement-généralement une routine ou macro-qui permet à un programme de vérifier lui-même pendant qu'il exécute. Lorsqu'un l'affirmation est vraie, cela signifie que tout fonctionne comme prévu. Quand il est faux, cela signifie qu'il a détecté une erreur inattendue dans le code. Pour par exemple, si le système suppose qu'une dossier ne sera jamais plus de 50.000 dossiers, le programme pourrait contenir une affirmation que le nombre de dossiers est inférieur ou égal à 50 000. Aussi longtemps que le nombre de dossiers est inférieure ou égale à 50 000, l'affirmation sera silencieuse. Si il rencontre plus de 50 000 disques, cependant, il va bruyamment "affirmer" qu'Il ya une erreur dans le programme.

Affirmations sont particulièrement utiles dans les grand, les programmes compliqués, et de dans les programmes de haute fiabilité. Ils permettent aux programmeurs de plus rapidement éliminer les hypothèses d'interface non concordantes, les erreurs qui se glissent quand le code est modifié, et ainsi de suite.

une assertion prend habituellement deux arguments: une expression booléenne qui décrit l'hypothèse qui est censée être vraie et un message à afficher si ce n'est pas le cas.

( ... )

Normalement, vous ne voulez pas les utilisateurs doivent voir les messages d'assertion dans code de production; les assertions sont principalement destinées à être utilisées pendant le développement et de la maintenance. Les affirmations sont compilés dans le code temps de développement et compilé hors du code pour la production. Lors développement, les assertions démasquent les hypothèses contradictoires, des conditions inattendues, des mauvaises valeurs transmises à la routine, et ainsi de suite. Au cours de la production, ils sont compilés hors du code de sorte que le les assertions ne dégradent pas les performances du système.

81
répondu juan 2012-07-10 03:55:02

vous devriez l'utiliser pour les moments où vous ne voulez pas avoir à briser chaque petite ligne de code pour vérifier les variables, mais vous voulez obtenir une sorte de rétroaction si certaines situations sont présentes, par exemple:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
34
répondu thelsdj 2008-10-02 17:31:13

Assert vous donne également une autre occasion de ricaner sur les compétences de conception D'interface utilisateur de Microsoft. Je veux dire: un dialogue à trois boutons abandonne, rejoue, Ignore, et une explication sur la façon de les interpréter dans la barre de titre!

11
répondu Joe 2008-10-02 17:33:02

Assert vous permet d'affirmer qu'une condition (post ou pre) s'applique dans votre code. C'est une façon de documenter vos intentions et de demander au débogueur de vous informer avec un dialogue si votre intention n'est pas respectée.

à la différence d'un point de rupture, L'Assert va avec votre code et peut être utilisé pour ajouter des détails supplémentaires sur votre intention.

8
répondu Jeff Yates 2008-10-02 17:26:03

Assert peut vous aider à donner un comportement de messagerie séparé entre testing et release. Par exemple,

Debug.Assert(x > 2)

ne déclenchera une pause que si vous exécutez une construction" debug", pas une construction de version. Il y a un exemple complet de ce comportement ici

8
répondu Ryan 2008-10-02 17:27:53
La méthode

tout d'abord Assert() est disponible pour les classes Trace et Debug .

Debug.Assert() n'est exécuté qu'en mode de débogage.

Trace.Assert() est exécuté en mode de débogage et de publication.

voici un exemple:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

exécute ce code en mode Debug puis en mode Release.

enter image description here

vous remarquerez que pendant le mode de débogage votre déclaration de code Debug.Assert échoue, vous obtenez une boîte de message montrant la trace de pile actuelle de l'application. Cela ne se produit pas en mode de Libération depuis Trace.Assert() condition est vraie (i == 4) .

WriteLine() méthode vous donne simplement une option de journalisation de l'information à la sortie de Visual Studio. enter image description here

4
répondu Serge Voloshenko 2017-01-02 19:12:25

je pense que La c'est de Débogage.Assert est une façon d'établir un contrat sur la façon dont une méthode est censée être appelée, en se concentrant sur les détails sur les valeurs d'un paramétreur (au lieu de juste le type). Par exemple, si vous n'êtes pas censé envoyer un null dans le second paramètre, vous ajoutez L'Assert autour de ce paramètre pour dire au consommateur de ne pas le faire.

il empêche quelqu'un d'utiliser votre code d'une manière désobligeante. Mais il permet aussi que la manière boneheaded à passer à la production et ne pas donner le message méchant à un client (en supposant que vous construisez une version construire).

3
répondu Flory 2008-10-02 17:51:41

Affirmations fonctionnalité fortement dans la Conception par Contrat (DbC) qui, comme je comprends été introduite/approuvé par Meyer, Bertand. 1997. Construction De Logiciels Orientés Objet.

une caractéristique importante est qu'ils ne doivent pas produire d'effets secondaires, par exemple, vous pouvez gérer une exception ou prendre une autre ligne d'action avec un if(defensive programming).

Les Assertions

sont utilisées pour vérifier les conditions pré/post du contrat, les relation client / fournisseur-le client doit s'assurer que les conditions préalables du fournisseur sont respectées, p. ex. envoie £5 et le fournisseur doit s'assurer que les conditions postérieures sont remplies, par exemple. Livre 12 roses. (Simple explication du client / fournisseur - peut accepter moins et livrer plus, mais au sujet des Assertions). C# introduit aussi Trace.Assert (), qui peut être utilisé pour le code de publication.

pour répondre à la question oui ils sont toujours utiles, mais peuvent ajouter complexité+lisibilité au code et temps+difficile à maintenir. Devrions-nous continuer à les utiliser? Oui, Allons-nous tous de les utiliser? Probablement pas, ou pas à la mesure de ce que Meyer décrit.

(même le cours ou Java sur lequel j'ai appris cette technique n'a montré que des exemples simples et le reste du code n'a pas appliqué les règles d'assertion DbC sur la plupart du code, mais a été supposé être utilisé pour assurer l'exactitude du programme!)

3
répondu Knightlore 2010-11-16 21:03:42