Assertions dans du code managé

Une assertion, ou instruction Assert, teste une condition, que vous spécifiez en tant qu'argument à l'instruction Assert.Si la condition a la valeur true, aucune action ne se produit.Si la condition a la valeur false, l'assertion échoue.S'il est exécuté avec une version Debug, votre programme passe en mode arrêt.

Dans cette rubrique

Assertions dans l'espace de noms de System.Diagnostics

La méthode de Debug.Assert

Effets secondaires de Debug.Assert

Exigences relatives à Trace et Debug

Arguments assert

Personnaliser le comportement d'assertion

Assertions de configuration dans les fichiers de configuration

Assertions dans l'espace de noms de System.Diagnostics

Dans Visual Basic et Visual C#, vous pouvez utiliser la méthode Assert de Debug ou Trace, qui est dans l'espace de noms System.Diagnostics.Les méthodes de la classe Debug ne sont pas incluses dans une version Release de votre programme ; par conséquent, elles n'augmentent pas la taille ou ne réduisent pas la vitesse de votre code de version Release.

C++ ne prend pas en charge les méthodes de classe Debug.Vous pouvez accomplir le même effet grâce à la classe Trace avec compilation conditionnelle, telle que #ifdef DEBUG...#endif.

Dans cette rubrique

La méthode de Debug.Assert

Utilisez librement la méthode Debug.Assert pour tester les conditions qui doivent avoir la valeur true si votre code est correct.Par exemple, si vous avez écrit une fonction de division d'entier.Selon les règles mathématiques, le diviseur ne peut pas être égal à zéro.Vous pouvez tester cela en utilisant une assertion :

Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
    Debug.Assert(divisor <> 0)
    Return CInt(dividend / divisor)
End Function
int IntegerDivide ( int dividend , int divisor )
    { Debug.Assert ( divisor != 0 );
        return ( dividend / divisor ); }

Lorsque vous exécutez ce code sous le débogueur, l'instruction d'assertion est évaluée, mais dans la version Release, la comparaison n'est pas faite, donc il n'y a pas de charge mémoire supplémentaire.

Voici un autre exemple.Vous avez une classe qui implémente un compte courant de la manière suivante :

Dim amount, balance As Double
balance = savingsAccount.balance
Debug.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Avant de retirer de l'argent du compte, vous voulez vous assurer que le crédit de votre compte est suffisant pour couvrir la somme que vous allez retirer.Vous pouvez écrire une assertion pour contrôler le solde :

Dim amount, balance As Double
balance = savingsAccount.balance
Trace.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Notez que les appels à la méthode Debug.Assert disparaissent lorsque vous créez une version Release de votre code.Cela signifie que l'appel qui vérifie l'équilibre disparaît dans la version Release.Pour résoudre ce problème, remplacez Debug.Assert par Trace.Assert, qui ne disparaît pas dans la version Release :

Les appels à Trace.Assert, contrairement aux appels à Debug.Assert, ajoutent une charge mémoire à la version Release.

Dans cette rubrique

Effets secondaires de Debug.Assert

Lorsque vous utilisez Debug.Assert, veillez à ce qu'aucun code dans Assert ne change les résultats du programme si Assert est supprimé.Sinon, vous pouvez par accident introduire un bogue qui ne se produira que dans la version Release de votre programme.Soyez particulièrement vigilant avec les instructions Assert qui contiennent des appels de fonction ou de procédure, comme par exemple dans l'exemple suivant :

' unsafe code
Debug.Assert (meas(i) <> 0 )
// unsafe code
Debug.Assert (meas(i) != 0 );

Cette utilisation de Debug.Assert peut sembler sûre à première vue, mais supposons que la fonction meas mette à jour un compteur à chaque fois qu'elle est appelée.Lorsque vous générez la version Release, cet appel à meas est éliminé, et le compteur ne sera pas mis à jour.Il s'agit d'un exemple d'une fonction avec un effet secondaire.L'élimination d'un appel à une fonction qui a un effet secondaire peut générer un bogue qui n'apparaît que dans la version Release.Pour éviter ce genre de problèmes, ne placez pas d'appels de fonction dans une instruction Debug.Assert.Utilisez une variable temporaire à la place :

temp = meas( i )
Debug.Assert (temp <> 0)
temp = meas( i );
Debug.Assert ( temp != 0 );

Même lorsque vous utilisez Trace.Assert, vous pouvez toujours vouloir éviter de placer des appels de fonction dans une instruction Assert.Ces appels doivent être sécurisés, car les instructions Trace.Assert ne sont pas éliminées dans une version Release.Cependant, si vous évitez ces constructions en règle générale, vous ferez moins d'erreurs lors de l'utilisation de Debug.Assert.

Dans cette rubrique

Exigences relatives à Trace et Debug

Si vous créez votre projet en utilisant les Assistants Visual Studio, le symbole TRACE est défini par défaut dans les configurations Release et Debug.Le symbole DEBUG est défini par défaut uniquement dans la version Debug.

Sinon, pour que les méthodes Trace fonctionnent, votre programme doit avoir l'un des éléments suivants en haut du fichier source :

  • #Const TRACE = True en Visual Basic

  • #define TRACE en Visual C# et C++

Ou votre programme doit être généré avec l'option TRACE :

  • /d:TRACE=True en Visual Basic

  • /d:TRACE en Visual C# et C++

Si vous avez besoin d'utiliser les méthodes Debug dans une version Release C# ou Visual Basic, vous devez définir le symbole DEBUG dans votre configuration Release.

C++ ne prend pas en charge les méthodes de classe Debug.Vous pouvez accomplir le même effet grâce à la classe Trace avec compilation conditionnelle, telle que #ifdef DEBUG...#endif.Vous pouvez définir ces symboles dans la boîte de dialogue Pages de propriétés de <Projet>.Pour plus d'informations, consultez Modification des paramètres de projet pour une configuration Debug Visual Basic ou Modification des paramètres de projet pour une configuration Debug C ou C++.

Arguments assert

Trace.Assert et Debug.Assert utilisent trois arguments au maximum.Le premier argument, qui est obligatoire, est la condition que vous souhaitez vérifier.Si vous appelez Trace.Assert(Boolean) ou Debug.Assert(Boolean) avec un seul argument, la méthode Assert vérifie la condition et, si le résultat est false, renvoie le contenu de la pile des appels dans la fenêtre Sortie.L'exemple suivant affiche Trace.Assert(Boolean) et Debug.Assert(Boolean) :

Debug.Assert(stacksize > 0)
Trace.Assert(stacksize > 0)
Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 ); 

Le deuxième et le troisième arguments, s'ils sont présents, doivent être des chaînes.Si vous appelez Trace.Assert ou Debug.Assert avec deux ou trois arguments, le premier argument est une condition.La méthode vérifie la condition et, si le résultat est false, renvoie les deuxième et troisième chaînes.L'exemple suivant montre Debug.Assert(Boolean, String) et Trace.Assert(Boolean, String) utilisés avec deux arguments.

Debug.Assert(stacksize > 0, "Out of stack space")
Trace.Assert(stacksize > 0, "Out of stack space")
Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );

L'exemple suivant affiche Assert et Assert :

Debug.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:", "inctemp failed on third call" )
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" ); 

Dans cette rubrique

Personnaliser le comportement d'assertion

Si vous exécutez votre application en mode interface utilisateur, la méthode Assert affiche la boîte de dialogue Échec de l'assertion lorsque la condition échoue.Les actions qui se produisent lorsqu'une assertion échoue sont contrôlées par la propriété d' Listeners ou d' Listeners .

Vous pouvez personnaliser le comportement en sortie en ajoutant un objet TraceListener à la collection Listeners, en supprimant un TraceListener de la collection Listeners ou en substituant la méthode TraceListener.Fail par un TraceListener existant pour modifier son comportement.

Par exemple, vous pouvez substituer la méthode TraceListener.Fail pour écrire dans un journal des événements au lieu d'afficher la boîte de dialogue Échec de l'assertion.

Pour personnaliser la sortie de cette façon, votre programme doit contenir un écouteur et vous devez hériter de TraceListener et substituer sa méthode TraceListener.Fail.

Pour plus d'informations, consultez Écouteurs de la trace.

Dans cette rubrique

Assertions de configuration dans les fichiers de configuration

Vous pouvez définir des assertions dans le fichier de configuration de votre programme ainsi que dans votre code.Pour plus d'informations, consultez Trace.Assert ou Debug.Assert.

Voir aussi

Tâches

Comment : effectuer une compilation conditionnelle avec Trace et Debug

Référence

Debug.Assert

Trace.Assert

Concepts

Sécurité du débogueur

Autres ressources

Traçage et instrumentation d'applications

Préparation du débogage : types de projets C#, F# et Visual Basic

Débogage du code managé