Delen via


Asserties in beheerde code

Met een assertie of Assert-instructie wordt een voorwaarde getest, die u opgeeft als een argument voor de Assert-instructie. Als de voorwaarde wordt geëvalueerd als waar, wordt er geen actie uitgevoerd. Als de voorwaarde wordt geëvalueerd als onwaar, mislukt de assertie. Als u met een foutopsporingsbuild werkt, wordt de onderbrekingsmodus van uw programma geactiveerd.

In dit onderwerp

Asserts in de System.Diagnostics-naamruimte

De methode Debug.Assert

Bijwerkingen van Debug.Assert

Vereisten voor traceren en fouten opsporen

Argumenten bevestigen

Assert-gedrag aanpassen

Asserties instellen in configuratiebestanden

Asserts in de System.Diagnostics-naamruimte

In Visual Basic en Visual C# kunt u de Assert methode gebruiken vanuit Debug of Trace, die zich in de System.Diagnostics naamruimte bevinden. Debug klassemethoden worden niet opgenomen in een releaseversie van uw programma, zodat ze de grootte niet vergroten of de snelheid van uw releasecode verminderen.

C++ biedt geen ondersteuning voor de Debug klassemethoden. U kunt hetzelfde effect bereiken met behulp van de Trace klasse met voorwaardelijke compilatie, zoals #ifdef DEBUG... #endif.

In dit onderwerp

De methode Debug.Assert

Gebruik de methode System.Diagnostics.Debug.Assert vrij om voorwaarden te testen die waar moeten zijn als uw code juist is. Stel dat u een functie voor het delen van gehele getallen hebt geschreven. Door de regels van wiskunde kan de deler nooit nul zijn. U kunt dit testen met behulp van een assertie:

int IntegerDivide ( int dividend , int divisor )
{
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor );
}

Wanneer u deze code uitvoert onder het foutopsporingsprogramma, wordt de assertie-instructie geëvalueerd, maar in de releaseversie wordt de vergelijking niet gemaakt, dus er is geen extra overhead.

Hier volgt nog een voorbeeld. U hebt een klasse die als volgt een controleaccount implementeert:

float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Voordat u geld uit de rekening opneemt, moet u ervoor zorgen dat het rekeningsaldo voldoende is om het bedrag te dekken dat u wilt intrekken. U kunt een verklaring schrijven om het saldo te controleren:

float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Houd er rekening mee dat aanroepen naar de System.Diagnostics.Debug.Assert methode verdwijnen wanneer u een releaseversie van uw code maakt. Dat betekent dat de aanroep waarmee het saldo wordt gecontroleerd, verdwijnt in de releaseversie. Als u dit probleem wilt oplossen, moet u System.Diagnostics.Debug.Assert vervangen door System.Diagnostics.Trace.Assert, wat niet verdwijnt in de Releaseversie:

Oproepen naar System.Diagnostics.Trace.Assert voegen overhead toe aan uw Release-versie, in tegenstelling tot oproepen naar System.Diagnostics.Debug.Assert.

In dit onderwerp

Bijwerkingen van Debug.Assert

Wanneer u System.Diagnostics.Debug.Assert gebruikt, moet u ervoor zorgen dat de resultaten van het programma niet veranderen als Assert wordt verwijderd en dat de code binnen Assert geen invloed uitoefent. Anders kunt u per ongeluk een bug introduceren die alleen wordt weergegeven in de releaseversie van uw programma. Wees vooral voorzichtig met asserties die functie- of procedure-aanroepen bevatten, zoals het volgende voorbeeld:

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

Dit gebruik van System.Diagnostics.Debug.Assert kan op het eerste gezicht veilig lijken, maar stel dat de functie meas een teller bijwerkt telkens wanneer deze wordt aangeroepen. Wanneer u de releaseversie bouwt, wordt deze aanroep naar meas geëlimineerd, zodat de teller niet wordt bijgewerkt. Dit is een voorbeeld van een functie met een neveneffect. Als u een aanroep naar een functie met bijwerkingen elimineert, kan dit leiden tot een fout die alleen in de releaseversie wordt weergegeven. Als u dergelijke problemen wilt voorkomen, plaatst u geen functie-aanroepen in een System.Diagnostics.Debug.Assert instructie. Gebruik in plaats daarvan een tijdelijke variabele:

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

Zelfs wanneer u gebruikt System.Diagnostics.Trace.Assert, wilt u misschien nog steeds voorkomen dat u functieaanroepen binnen een Assert instructie plaatst. Dergelijke aanroepen moeten veilig zijn, omdat System.Diagnostics.Trace.Assert uitspraken niet worden geëlimineerd in een release-build. Als u dergelijke constructies echter vermijdt als een kwestie van gewoonte, zult u minder waarschijnlijk een fout maken wanneer u gebruikt System.Diagnostics.Debug.Assert.

In dit onderwerp

Vereisten voor traceren en fouten opsporen

Als u uw project maakt met behulp van de Visual Studio-wizards, wordt het TRACE-symbool standaard gedefinieerd in configuraties voor release en foutopsporing. Het symbool DEBUG wordt standaard alleen gedefinieerd in de build Voor foutopsporing.

Anders moet uw programma boven aan het bronbestand een van de volgende elementen hebben om de Trace-methoden te laten werken:

Argumenten bevestigen

System.Diagnostics.Trace.Assert en System.Diagnostics.Debug.Assert neemt maximaal drie argumenten in beslag. Het eerste argument, dat verplicht is, is de voorwaarde die u wilt controleren. Als u aanroept System.Diagnostics.Trace.Assert(Boolean) of System.Diagnostics.Debug.Assert(Boolean) met slechts één argument, controleert de Assert methode de voorwaarde en, als het resultaat onwaar is, wordt de inhoud van de aanroepstack uitgevoerd naar het uitvoervenster . In het volgende voorbeeld ziet u System.Diagnostics.Trace.Assert(Boolean) en System.Diagnostics.Debug.Assert(Boolean):

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

De tweede en derde argumenten, indien aanwezig, moeten tekenreeksen zijn. Als u twee of drie argumenten aanroept System.Diagnostics.Trace.Assert , System.Diagnostics.Debug.Assert is het eerste argument een voorwaarde. De methode controleert de voorwaarde en als het resultaat onwaar is, wordt de tweede tekenreeks en derde tekenreeks uitgevoerd. Het volgende voorbeeld toont System.Diagnostics.Debug.Assert(Boolean, String) en System.Diagnostics.Trace.Assert(Boolean, String) gebruikt met twee argumenten:

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

Het volgende voorbeeld laat System.Diagnostics.Debug.Assert(Boolean, String, String) en System.Diagnostics.Trace.Assert(Boolean, String, String) zien, gebruikt met drie argumenten.

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

In dit onderwerp

Assert-gedrag aanpassen

Als u uw toepassing uitvoert in de gebruikersinterfacemodus, wordt in de Assert methode het dialoogvenster Assertion Failed weergegeven wanneer de voorwaarde mislukt. De acties die optreden wanneer een assertie mislukt, worden beheerd door de Listeners of Listeners eigenschap.

U kunt het uitvoergedrag aanpassen door een TraceListener object toe te voegen aan de Listeners verzameling, door een TraceListener object uit de Listeners verzameling te verwijderen of door de System.Diagnostics.TraceListener.Fail methode van een bestaande TraceListener te overschrijven, zodat het zich anders gedraagt.

U kunt bijvoorbeeld de System.Diagnostics.TraceListener.Fail methode overschrijven om naar een gebeurtenislogboek te schrijven in plaats van het dialoogvenster Assertion Failed weer te geven.

Als u de uitvoer op deze manier wilt aanpassen, moet uw programma een listener bevatten, en moet u erven van TraceListener en de System.Diagnostics.TraceListener.Fail methode overschrijven.

Zie Trace Listeners voor meer informatie.

In dit onderwerp

Asserties instellen in configuratiebestanden

U kunt asserties instellen in uw programmaconfiguratiebestand en in uw code. Zie of System.Diagnostics.Trace.Assertvoor meer informatieSystem.Diagnostics.Debug.Assert.