Assertionen in verwaltetem CodeAssertions in Managed Code

Mithilfe einer Assertion oder einer Assert-Anweisung wird eine Bedingung überprüft, die Sie als Argument der Assert-Anweisung angeben.An assertion, or Assert statement, tests a condition, which you specify as an argument to the Assert statement. Wenn die Bedingung als "Tue" ausgewertet wird, erfolgt keine Aktion.If the condition evaluates to true, no action occurs. Wenn die Bedingung auf "False" ausgewertet wird, schlägt die Assertion fehl.If the condition evaluates to false, the assertion fails. Wenn das Programm mit einem Debugbuild ausgeführt wird, wechselt es in den Unterbrechungsmodus.If you are running with a debug build, your program enters break mode.

In diesem ThemaIn this topic

Assertionen im System.Diagnostics-NamespaceAsserts in the System.Diagnostics Namespace

Die Debug.Assert-MethodeThe Debug.Assert method

Nebeneffekte der Debug.Assert-MethodeSide effects of Debug.Assert

Anforderungen für Ablaufverfolgung und DebugTrace and Debug Requirements

Assert-ArgumenteAssert arguments

Anpassen des Assert-VerhaltensCustomizing Assert behavior

Festlegen von Assertionen in KonfigurationsdateienSetting assertions in configuration files

Assertionen im System.Diagnostics-NamespaceAsserts in the System.Diagnostics Namespace

In Visual Basic und Visual C# können Sie die Assert-Methode von Debug oder Trace verwenden, die sich im System.Diagnostics-Namespace befinden.In Visual Basic and Visual C#, you can use the Assert method from either Debug or Trace, which are in the System.Diagnostics namespace. Debug-Klassenmethoden sind nicht in einer Releaseversion des Programms enthalten, weshalb sie nicht den Versionscode vergrößern oder dessen Geschwindigkeit reduzieren.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++ unterstützt nicht die Debug-Klassenmethoden.C++ does not support the Debug class methods. Sie können dieselbe Wirkung durch Verwenden der Trace-Klasse mit bedingter Kompilierung erzielen, z.B. #ifdef DEBUG... #endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif.

InhaltIn this topic

Die Debug.Assert-MethodeThe Debug.Assert method

Sie können die System.Diagnostics.Debug.Assert-Methode beliebig verwenden, um Bedingungen zu überprüfen, die bei fehlerfreiem Code "True" ergeben sollten.Use the System.Diagnostics.Debug.Assert method freely to test conditions that should hold true if your code is correct. Angenommen, Sie haben eine Funktion zum Dividieren von ganzen Zahlen geschrieben.For example, suppose you have written an integer divide function. Gemäß den Regeln der Mathematik kann der Divisor niemals 0 sein.By the rules of mathematics, the divisor can never be zero. Sie könnten diese Bedingung mithilfe einer Assertion testen: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 ); }

Wenn Sie diesen Code im Debugger ausführen, wird die Assertionsanweisung ausgewertet. In der Releaseversion findet der Vergleich jedoch nicht statt, sodass kein Mehraufwand entsteht.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.

Im Folgenden ist ein weiteres Beispiel angegeben.Here is another example. Sie verfügen über eine Klasse, mit der ein Girokonto wie folgt implementiert wird: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 );

Bevor Sie Geld von diesem Konto abheben, müssen Sie sicherstellen, dass das Konto genügend Deckung für den abzuhebenden Betrag aufweist.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. Sie können eine Assertion schreiben, um den Saldo zu überprüfen: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 );

Bedenken Sie, dass Aufrufe der System.Diagnostics.Debug.Assert-Methode nicht mehr verfügbar sind, wenn Sie eine Releaseversion des Codes erstellen.Note that calls to the System.Diagnostics.Debug.Assert method disappear when you create a Release version of your code. Dies bedeutet, dass der Aufruf zum Überprüfen des Kontosaldos in der Releaseversion nicht mehr vorhanden ist.That means that the call that checks the balance disappears in the Release version. Um dieses Problem zu beheben, ersetzen Sie System.Diagnostics.Debug.Assert durch System.Diagnostics.Trace.Assert, denn diese Methode ist in der Releaseversion weiterhin vorhanden.To solve this problem, you should replace System.Diagnostics.Debug.Assert with System.Diagnostics.Trace.Assert, which does not disappear in the Release version:

Aufrufe von System.Diagnostics.Trace.Assert verursachen jedoch im Gegensatz zu Aufrufen von System.Diagnostics.Debug.Assert in der Releaseversion einen Mehraufwand.Calls to System.Diagnostics.Trace.Assert add overhead to your Release version, unlike calls to System.Diagnostics.Debug.Assert.

InhaltIn this topic

Nebeneffekte der Debug.Assert-MethodeSide effects of Debug.Assert

Stellen Sie bei Verwendung der System.Diagnostics.Debug.Assert-Methode sicher, dass die Programmergebnisse nicht vom Code innerhalb der Assert-Methode beeinflusst werden, wenn Assert entfernt wurde.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. Andernfalls kann dies zu einem Fehler führen, der lediglich in der Releaseversion des Programms auftritt.Otherwise, you might accidentally introduce a bug that only shows up in the Release version of your program. Auch bei Assertionen, die Funktions- oder Prozeduraufrufe enthalten, sollte besonders sorgfältig vorgegangen werden, wie im folgenden Beispiel: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 );

Diese Verwendung der System.Diagnostics.Debug.Assert-Methode mag auf den ersten Blick sicher erscheinen. Was geschieht jedoch, wenn die Funktion "meas" bei jedem Aufruf einen Zähler aktualisiert?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. Bei der Erstellung der Releaseversion wird dieser Aufruf der Funktion "meas" entfernt, sodass der Zähler nicht mehr aktualisiert wird.When you build the Release version, this call to meas is eliminated, so the counter does not get updated. Dies ist ein Beispiel für eine Funktion mit einem Nebeneffekt.This is an example of a function with a side effect. Durch das Entfernen eines Funktionsaufrufs, der Nebeneffekte hat, kann ein Fehler verursacht werden, der ausschließlich in der Releaseversion auftritt.Eliminating a call to a function that has side effects could result in a bug that only appears in the Release version. Um derartige Probleme zu vermeiden, sollten Sie keine Funktionsaufrufe in eine System.Diagnostics.Debug.Assert-Anweisung einfügen.To avoid such problems, do not place function calls in a System.Diagnostics.Debug.Assert statement. Verwenden Sie stattdessen eine temporäre Variable:Use a temporary variable instead:

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

Auch wenn Sie die System.Diagnostics.Trace.Assert-Methode verwenden, möchten Sie möglicherweise Funktionsaufrufe innerhalb einer Assert-Anweisung vermeiden.Even when you use System.Diagnostics.Trace.Assert, you might still want to avoid placing function calls inside an Assert statement. Solche Aufrufe sollten kein Risiko darstellen, da System.Diagnostics.Trace.Assert-Anweisungen nicht aus einem Releasebuild entfernt werden.Such calls should be safe, because System.Diagnostics.Trace.Assert statements are not eliminated in a Release build. Wenn Sie es sich jedoch zur Gewohnheit machen, solche Konstrukte zu vermeiden, können Sie Fehlern bei Verwendung der System.Diagnostics.Debug.Assert-Methode vorbeugen.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.

InhaltIn this topic

Voraussetzungen für Ablaufverfolgung und DebugTrace and Debug Requirements

Wenn Sie das Projekt mithilfe der Visual StudioVisual Studio-Assistenten erstellen, wird das TRACE-Symbol sowohl in der Release- als auch in der Debugkonfiguration automatisch definiert.If you create your project using the Visual StudioVisual Studio wizards, the TRACE symbol is defined by default in both Release and Debug configurations. Das DEBUG-Symbol ist standardmäßig nur im Debugbuild definiert.The DEBUG symbol is defined by default only in the Debug build.

Andernfalls funktionieren die Trace-Methoden nur dann, wenn im Programm am Anfang der Quelldatei Folgendes steht:Otherwise, for Trace methods to work, your program must have one of the following at the top of the source file:

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

  • #define TRACE in Visual C# und C++#define TRACE in Visual C# and C++

    Oder das Programm muss mit der TRACE-Option erstellt werden:Or your program must be built with the TRACE option:

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

  • /d:TRACE in Visual C# und C++/d:TRACE in Visual C# and C++

    Wenn Debug-Methoden in einem C#- oder Visual Basic-Releasebuild verwendet werden sollen, müssen Sie das DEBUG-Symbol in der Releasekonfiguration definieren.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++ unterstützt nicht die Debug-Klassenmethoden.C++ does not support the Debug class methods. Sie können dieselbe Wirkung durch Verwenden der Trace-Klasse mit bedingter Kompilierung erzielen, z.B. #ifdef DEBUG... #endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif. Diese Symbole können im Dialogfeld für die <Projekt>-Eigenschaftenseiten definiert werden.You can define these symbols in the <Project> Property Pages dialog box. Weitere Informationen finden Sie unter Ändern von Projekteinstellungen für eine Visual Basic-Debugkonfiguration oder unter Ändern von Projekteinstellungen für eine C- oder C++-Debugkonfiguration.For more information, see Changing Project Settings for a Visual Basic Debug Configuration or Changing Project Settings for a C or C++ Debug Configuration.

Assert-ArgumenteAssert arguments

Die System.Diagnostics.Trace.Assert- und System.Diagnostics.Debug.Assert-Methoden nehmen bis zu drei Argumente an.System.Diagnostics.Trace.Assert and System.Diagnostics.Debug.Assert take up to three arguments. Das erste Argument, das obligatorisch ist, bezieht sich auf die zu überprüfende Bedingung.The first argument, which is mandatory, is the condition you want to check. Bei einem Aufruf der System.Diagnostics.Trace.Assert(Boolean)- oder System.Diagnostics.Debug.Assert(Boolean)-Methode mit nur einem Argument wird die Bedingung von der Assert-Methode überprüft. Wenn das Ergebnis „False“ lautet, wird der Inhalt der Aufrufliste im Ausgabefenster angezeigt.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. Im folgenden Beispiel werden die System.Diagnostics.Trace.Assert(Boolean)- und System.Diagnostics.Debug.Assert(Boolean)-Methoden veranschaulicht: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 );

Beim zweiten und dritten Argument (sofern vorhanden) muss es sich um Zeichenfolgen handeln.The second and third arguments, if present, must be strings. Wenn Sie die System.Diagnostics.Trace.Assert- oder System.Diagnostics.Debug.Assert-Methode mit zwei oder drei Argumenten aufrufen, ist das erste Argument eine Bedingung.If you call System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert with two or three arguments, the first argument is a condition. Die Methode überprüft die Bedingung und gibt die als zweites und drittes Argument übergebenen Zeichenfolgen zurück, wenn das Ergebnis "False" lautet.The method checks the condition and, if the result is false, outputs the second string and third strings. Im folgenden Beispiel wird die Verwendung der System.Diagnostics.Debug.Assert(Boolean, String)- und System.Diagnostics.Trace.Assert(Boolean, String)-Methoden mit zwei Argumenten veranschaulicht: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" );

Im folgenden Beispiel werden die Assert- und Assert-Methoden veranschaulicht: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" );

InhaltIn this topic

Anpassen des Assert-VerhaltensCustomizing Assert behavior

Wenn Sie die Anwendung im Benutzeroberflächenmodus ausführen, wird durch die Assert-Methode das Dialogfeld Assertionsfehler angezeigt, falls die Bedingung nicht erfüllt wird.If you run your application in user-interface mode, the Assert method displays the Assertion Failed dialog box when the condition fails. Die Aktionen, die bei einem Assertionsfehler auszuführen sind, werden von der Listeners-Eigenschaft oder der Listeners-Eigenschaft gesteuert.The actions that occur when an assertion fails are controlled by the Listeners or Listeners property.

Das Ausgabeverhalten kann wie folgt angepasst werden: durch Hinzufügen eines TraceListener-Objekts zur Listeners-Auflistung, durch Entfernen eines TraceListener-Objekts aus der Listeners-Auflistung oder durch Überschreiben der System.Diagnostics.TraceListener.Fail-Methode eines vorhandenen TraceListener-Objekts, um sein Verhalten zu ändern.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.

Sie können beispielsweise die System.Diagnostics.TraceListener.Fail-Methode überschreiben, um die Ausgabe in ein Ereignisprotokoll zu schreiben, anstatt das Dialogfeld Assertionsfehler anzuzeigen.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.

Damit die Ausgabe auf diese Weise angepasst werden kann, muss das Programm über einen Listener verfügen, der von TraceListener erbt und dessen System.Diagnostics.TraceListener.Fail-Methode überschrieben wird.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.

Weitere Informationen finden Sie unter Ablaufverfolgungslistener.For more Information, see Trace Listeners.

InhaltIn this topic

Festlegen von Assertionen in KonfigurationsdateienSetting assertions in configuration files

Sie können Assertionen sowohl in der Programmkonfigurationsdatei als auch im Code festlegen.You can set assertions in your program configuration file as well as in your code. Weitere Informationen finden Sie unter System.Diagnostics.Trace.Assert oder System.Diagnostics.Debug.Assert.For more information, see System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert.

Siehe auchSee Also