Assertions dans du code managéAssertions in Managed Code

Une assertion, ou instruction Assert, teste une condition, que vous spécifiez en tant qu'argument à l'instruction Assert.An assertion, or Assert statement, tests a condition, which you specify as an argument to the Assert statement. Si la condition a la valeur true, aucune action ne se produit.If the condition evaluates to true, no action occurs. Si la condition a la valeur false, l'assertion échoue.If the condition evaluates to false, the assertion fails. S'il est exécuté avec une version Debug, votre programme passe en mode arrêt.If you are running with a debug build, your program enters break mode.

Dans cette rubriqueIn this topic

Assertions dans l’espace de noms System.DiagnosticsAsserts in the System.Diagnostics Namespace

Méthode Debug.AssertThe Debug.Assert method

Effets secondaires de Debug.AssertSide effects of Debug.Assert

Exigences relatives à Trace et DebugTrace and Debug Requirements

Arguments AssertAssert arguments

Personnalisation du comportement d’AssertCustomizing Assert behavior

Définition d’assertions dans les fichiers de configurationSetting assertions in configuration files

Assertions dans l’espace de noms System.DiagnosticsAsserts in the System.Diagnostics Namespace

En 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.In Visual Basic and Visual C#, you can use the Assert method from either Debug or Trace, which are in the System.Diagnostics namespace. 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.Debug class methods are not included in a Release version of your program, so they do not increase the size or reduce the speed of your release code.

C++ ne prend pas en charge les méthodes de classe Debug.C++ does not support the Debug class methods. Vous pouvez obtenir le même effet en utilisant la classe Trace avec la compilation conditionnelle, telle que #ifdef DEBUG... #endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif.

Dans cette rubriqueIn this topic

Méthode Debug.AssertThe Debug.Assert method

Utilisez librement la méthode System.Diagnostics.Debug.Assert pour tester les conditions qui doivent avoir la valeur true si votre code est correct.Use the System.Diagnostics.Debug.Assert method freely to test conditions that should hold true if your code is correct. Par exemple, si vous avez écrit une fonction de division d'entier.For example, suppose you have written an integer divide function. Selon les règles mathématiques, le diviseur ne peut pas être égal à zéro.By the rules of mathematics, the divisor can never be zero. Vous pouvez tester cela en utilisant une assertion :You might test this using an 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.When you run this code under the debugger, the assertion statement is evaluated, but in the Release version, the comparison is not made, so there is no additional overhead.

Voici un autre exemple.Here is another example. Vous avez une classe qui implémente un compte courant de la manière suivante :You have a class that implements a checking account, as follows:

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.Before you withdraw money from the account, you want to make sure that the account balance is sufficient to cover the amount you are preparing to withdraw. Vous pouvez écrire une assertion pour contrôler le solde :You might write an assertion to check the balance:

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 System.Diagnostics.Debug.Assert disparaissent lorsque vous créez une version Release de votre code.Note that calls to the System.Diagnostics.Debug.Assert method disappear when you create a Release version of your code. Cela signifie que l’appel qui vérifie l’équilibre disparaît dans la version Release.That means that the call that checks the balance disappears in the Release version. Pour résoudre ce problème, remplacez System.Diagnostics.Debug.Assert par System.Diagnostics.Trace.Assert, qui ne disparaît pas dans la version Release :To solve this problem, you should replace System.Diagnostics.Debug.Assert with System.Diagnostics.Trace.Assert, which does not disappear in the Release version:

Les appels à System.Diagnostics.Trace.Assert, contrairement aux appels à System.Diagnostics.Debug.Assert, ajoutent une charge mémoire à la version Release.Calls to System.Diagnostics.Trace.Assert add overhead to your Release version, unlike calls to System.Diagnostics.Debug.Assert.

Dans cette rubriqueIn this topic

Effets secondaires de Debug.AssertSide effects of Debug.Assert

Lorsque vous utilisez System.Diagnostics.Debug.Assert, veillez à ce qu'aucun code dans Assert ne change les résultats du programme si Assert est supprimé.When you use System.Diagnostics.Debug.Assert, make sure that any code inside Assert does not change the results of the program if Assert is removed. Sinon, vous pouvez par accident introduire un bogue qui ne se produira que dans la version Release de votre programme.Otherwise, you might accidentally introduce a bug that only shows up in the Release version of your program. 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 :Be especially careful about asserts that contain function or procedure calls, such as the following example:

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

Cette utilisation de System.Diagnostics.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.This use of System.Diagnostics.Debug.Assert might appear safe at first glance, but suppose the function meas updates a counter each time it is called. Lorsque vous générez la version Release, cet appel à meas est éliminé, et le compteur ne sera pas mis à jour.When you build the Release version, this call to meas is eliminated, so the counter does not get updated. Il s'agit d'un exemple d'une fonction avec un effet secondaire.This is an example of a function with a side effect. 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.Eliminating a call to a function that has side effects could result in a bug that only appears in the Release version. Pour éviter ce genre de problèmes, ne placez pas d'appels de fonction dans une instruction System.Diagnostics.Debug.Assert.To avoid such problems, do not place function calls in a System.Diagnostics.Debug.Assert statement. Utilisez une variable temporaire à la place :Use a temporary variable instead:

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

Même lorsque vous utilisez System.Diagnostics.Trace.Assert, vous pouvez toujours vouloir éviter de placer des appels de fonction dans une instruction Assert.Even when you use System.Diagnostics.Trace.Assert, you might still want to avoid placing function calls inside an Assert statement. Ces appels doivent être sécurisés, car les instructions System.Diagnostics.Trace.Assert ne sont pas éliminées dans une version Release.Such calls should be safe, because System.Diagnostics.Trace.Assert statements are not eliminated in a Release build. Cependant, si vous évitez ces constructions en règle générale, vous ferez moins d'erreurs lors de l'utilisation de System.Diagnostics.Debug.Assert.However, if you avoid such constructs as a matter of habit, you are less likely to make a mistake when you use System.Diagnostics.Debug.Assert.

Dans cette rubriqueIn this topic

Exigences relatives à Trace et DebugTrace and Debug Requirements

Si vous créez votre projet en utilisant les Assistants Visual StudioVisual Studio, le symbole TRACE est défini par défaut dans les configurations Release et Debug.If you create your project using the Visual StudioVisual Studio wizards, the TRACE symbol is defined by default in both Release and Debug configurations. Le symbole DEBUG est défini par défaut uniquement dans la version Debug.The DEBUG symbol is defined by default only in the Debug build.

Sinon, pour que les méthodes Trace fonctionnent, votre programme doit avoir l'un des éléments suivants en haut du fichier source :Otherwise, for Trace methods to work, your program must have one of the following at the top of the source file:

  • #Const TRACE = True en Visual Basic#Const TRACE = True in Visual Basic

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

    Ou votre programme doit être généré avec l'option TRACE :Or your program must be built with the TRACE option:

  • /d:TRACE=True en Visual Basic/d:TRACE=True in Visual Basic

  • /d:TRACE en Visual C# et C++/d:TRACE in Visual C# and 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.If you need to use the Debug methods in a C# or Visual Basic Release build, you must define the DEBUG symbol in your Release configuration.

    C++ ne prend pas en charge les méthodes de classe Debug.C++ does not support the Debug class methods. Vous pouvez obtenir le même effet en utilisant la classe Trace avec la compilation conditionnelle, telle que #ifdef DEBUG... #endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif. Vous pouvez définir ces symboles dans la boîte de dialogue Pages de propriétés de <Projet> .You can define these symbols in the <Project> Property Pages dialog box. 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++.For more information, see Changing Project Settings for a Visual Basic Debug Configuration or Changing Project Settings for a C or C++ Debug Configuration.

Arguments AssertAssert arguments

System.Diagnostics.Trace.Assert et System.Diagnostics.Debug.Assert utilisent trois arguments au maximum.System.Diagnostics.Trace.Assert and System.Diagnostics.Debug.Assert take up to three arguments. Le premier argument, qui est obligatoire, est la condition que vous souhaitez vérifier.The first argument, which is mandatory, is the condition you want to check. Si vous appelez System.Diagnostics.Trace.Assert(Boolean) ou System.Diagnostics.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.If you call System.Diagnostics.Trace.Assert(Boolean) or System.Diagnostics.Debug.Assert(Boolean) with only one argument, the Assert method checks the condition and, if the result is false, outputs the contents of the call stack to the Output window. L'exemple suivant affiche System.Diagnostics.Trace.Assert(Boolean) et System.Diagnostics.Debug.Assert(Boolean) :The following example shows System.Diagnostics.Trace.Assert(Boolean) and System.Diagnostics.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.The second and third arguments, if present, must be strings. Si vous appelez System.Diagnostics.Trace.Assert ou System.Diagnostics.Debug.Assert avec deux ou trois arguments, le premier argument est une condition.If you call System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert with two or three arguments, the first argument is a condition. La méthode vérifie la condition et, si le résultat est false, renvoie les deuxième et troisième chaînes.The method checks the condition and, if the result is false, outputs the second string and third strings. L’exemple suivant montre System.Diagnostics.Debug.Assert(Boolean, String) et System.Diagnostics.Trace.Assert(Boolean, String) utilisés avec deux arguments.The following example shows System.Diagnostics.Debug.Assert(Boolean, String) and System.Diagnostics.Trace.Assert(Boolean, String) used with two 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 :The following example shows Assert and 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 rubriqueIn this topic

Personnalisation du comportement d’AssertCustomizing Assert behavior

Si vous exécutez votre application en mode interface utilisateur, la méthode Assert affiche la boîte de dialogue Échec de l’assertion quand la condition échoue.If you run your application in user-interface mode, the Assert method displays the Assertion Failed dialog box when the condition fails. Les actions qui se produisent lors de l’échec d’une assertion sont contrôlées par la propriété Listeners ou la propriété Listeners.The actions that occur when an assertion fails are controlled by the Listeners or Listeners property.

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 System.Diagnostics.TraceListener.Fail par un TraceListener existant pour modifier son comportement.You can customize the output behavior by adding a TraceListener object to the Listeners collection, by removing a TraceListener from the Listeners collection, or by overriding the System.Diagnostics.TraceListener.Fail method of an existing TraceListener to make it behave differently.

Par exemple, vous pouvez substituer la méthode System.Diagnostics.TraceListener.Fail pour écrire dans un journal des événements au lieu d’afficher la boîte de dialogue Échec de l’assertion.For example, you could override the System.Diagnostics.TraceListener.Fail method to write to an event log instead of displaying the Assertion Failed dialog box.

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 System.Diagnostics.TraceListener.Fail.To customize the output in this way, your program must contain a listener, and you must inherit from TraceListener and override its System.Diagnostics.TraceListener.Fail method.

Pour plus d’informations, consultez Écouteurs de suivi.For more Information, see Trace Listeners.

Dans cette rubriqueIn this topic

Définition d’assertions dans les fichiers de configurationSetting assertions in configuration files

Vous pouvez définir des assertions dans le fichier de configuration de votre programme ainsi que dans votre code.You can set assertions in your program configuration file as well as in your code. Pour plus d'informations, consultez System.Diagnostics.Trace.Assert ou System.Diagnostics.Debug.Assert.For more information, see System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert.

Voir aussiSee also