Potwierdzenia w zarządzanym kodzie

Potwierdzenie (lub instrukcja Assert) testuje warunek, który określasz jako argument instrukcji Assert. Jeśli warunek ma wartość „true” (prawda), nie są wykonywane żadne akcje. Jeśli warunek ma wartość „false” (fałsz), asercja kończy się niepowodzeniem. W przypadku uruchamiania programu z kompilacją debugowania program przechodzi do trybu przerwania.

W tym temacie

Potwierdzenia w przestrzeni nazw System.Diagnostics

Metoda Debug.Assert

Skutki uboczne debug.assert

Wymagania dotyczące śledzenia i debugowania

Argumenty asertywne

Dostosowywanie zachowania asertywnego

Ustawianie asercji w plikach konfiguracji

Potwierdzenia w przestrzeni nazw System.Diagnostics

W programach Visual Basic i Visual C# można użyć Assert metody z Debug adresu lub Trace, które znajdują się w System.Diagnostics przestrzeni nazw. Debug Metody klas nie są uwzględniane w wersji wydania programu, więc nie zwiększają rozmiaru ani nie zmniejszają szybkości kodu wydania.

Język C++ nie obsługuje Debug metod klas. Ten sam efekt można osiągnąć za pomocą Trace klasy z kompilacją warunkową, taką jak #ifdef DEBUG... #endif.

W tym temacie

Metoda Debug.Assert

System.Diagnostics.Debug.Assert Użyj metody bezpłatnie, aby przetestować warunki, które powinny zawierać wartość true, jeśli kod jest poprawny. Załóżmy na przykład, że napisano funkcję dzielenia liczb całkowitych. Zgodnie z regułami matematycznymi dzielnik nigdy nie może być równy zero. Można to przetestować przy użyciu potwierdzenia:

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

Gdy uruchamiasz ten kod w debugerze, instrukcja asercji jest oceniana, ale w wersji wydanej nie zostanie wykonane porównanie, więc nie ma dodatkowych kosztów.

Oto kolejny przykład. Masz klasę, która implementuje konto kontrolne w następujący sposób:

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

Przed wycofaniem pieniędzy z konta chcesz upewnić się, że saldo konta jest wystarczające do pokrycia kwoty, którą przygotowujesz do wycofania. Możesz napisać asercję w celu sprawdzenia salda:

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

Pamiętaj, że wywołania System.Diagnostics.Debug.Assert metody znikają po utworzeniu wersji kodu. Oznacza to, że wywołanie sprawdzające saldo zniknie w wersji wydania. Aby rozwiązać ten problem, należy zastąpić element System.Diagnostics.Debug.Assert , System.Diagnostics.Trace.Assertktóry nie zniknie w wersji wydania:

Wywołania w celu System.Diagnostics.Trace.Assert dodania obciążenia do wersji wydania, w przeciwieństwie do wywołań metody System.Diagnostics.Debug.Assert.

W tym temacie

Skutki uboczne debug.assert

Jeśli używasz polecenia System.Diagnostics.Debug.Assert, upewnij się, że żaden kod wewnątrz Assert programu nie zmienia wyników programu, jeśli Assert zostanie usunięty. W przeciwnym razie można przypadkowo wprowadzić usterkę, która będzie wyświetlana tylko w wydanej wersji programu. Należy zachować szczególną ostrożność w przypadku asertów zawierających wywołania funkcji lub procedury, na przykład w poniższym przykładzie:

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

To użycie System.Diagnostics.Debug.Assert może wydawać się bezpieczne na pierwszy rzut oka, ale załóżmy, że meas funkcji aktualizuje licznik za każdym razem, gdy jest wywoływany. Po utworzeniu wersji wydania to wywołanie do meas zostanie wyeliminowane, więc licznik nie zostanie zaktualizowany. Jest to przykład funkcji z efektem ubocznym. Wyeliminowanie wywołania funkcji, która ma skutki uboczne, może spowodować usterkę, która pojawia się tylko w wersji wydania. Aby uniknąć takich problemów, nie umieszczaj wywołań funkcji w instrukcji System.Diagnostics.Debug.Assert . Zamiast tego użyj zmiennej tymczasowej:

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

Nawet jeśli używasz metody System.Diagnostics.Trace.Assert, nadal możesz unikać umieszczania wywołań funkcji wewnątrz instrukcji Assert . Takie wywołania powinny być bezpieczne, ponieważ System.Diagnostics.Trace.Assert instrukcje nie są usuwane w kompilacji wydania. Jeśli jednak unikasz takich konstrukcji jako materii nawyku, mniej prawdopodobne jest, aby popełnić błąd podczas korzystania z .System.Diagnostics.Debug.Assert

W tym temacie

Wymagania dotyczące śledzenia i debugowania

Jeśli tworzysz projekt przy użyciu kreatorów programu Visual Studio, symbol TRACE jest definiowany domyślnie zarówno w konfiguracjach wydania, jak i debugowania. Symbol DEBUGowania jest definiowany domyślnie tylko w kompilacji debugowania.

W przeciwnym razie, aby Trace metody działały, program musi mieć jeden z następujących elementów w górnej części pliku źródłowego:

  • #Const TRACE = True w Visual Basic

  • #define TRACE w języku Visual C# i C++

    Możesz też utworzyć program z opcją TRACE:

  • /d:TRACE=True w Visual Basic

  • /d:TRACE w języku Visual C# i C++

    Jeśli musisz użyć metod debugowania w kompilacji wersji języka C# lub Visual Basic, musisz zdefiniować symbol DEBUG w konfiguracji wydania.

    Język C++ nie obsługuje Debug metod klas. Ten sam efekt można osiągnąć za pomocą Trace klasy z kompilacją warunkową, taką jak #ifdef DEBUG... #endif. Te symbole można zdefiniować w <oknie dialogowym Strony właściwości projektu>. Aby uzyskać więcej informacji, zobacz Zmienianie Ustawienia projektu dla konfiguracji debugowania języka Visual Basic lub zmienianie Ustawienia projektu dla konfiguracji debugowania języka C lub C++.

Argumenty asertywne

System.Diagnostics.Trace.Assert i System.Diagnostics.Debug.Assert przyjąć do trzech argumentów. Pierwszy argument, który jest obowiązkowy, to warunek, który chcesz sprawdzić. W przypadku wywołania metody lub System.Diagnostics.Debug.Assert(Boolean) tylko jednego argumentu Assert metoda sprawdza warunek, a jeśli wynik jest fałszywy, zwraca zawartość stosu wywołań do okna Dane wyjściowe.System.Diagnostics.Trace.Assert(Boolean) W poniższym przykładzie pokazano System.Diagnostics.Trace.Assert(Boolean) i System.Diagnostics.Debug.Assert(Boolean):

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

Drugi i trzeci argument, jeśli istnieje, musi być ciągami. Jeśli wywołasz System.Diagnostics.Trace.Assert argument lub System.Diagnostics.Debug.Assert z dwoma lub trzema argumentami, pierwszym argumentem jest warunek. Metoda sprawdza warunek i, jeśli wynik ma wartość false, zwraca drugi ciąg i trzecie ciągi. W poniższym przykładzie pokazano System.Diagnostics.Debug.Assert(Boolean, String) i System.Diagnostics.Trace.Assert(Boolean, String) użyto dwóch argumentów:

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

W poniższym przykładzie pokazano System.Diagnostics.Debug.Assert(Boolean, String, String) i System.Diagnostics.Trace.Assert(Boolean, String, String) użyto trzech argumentów:

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

W tym temacie

Dostosowywanie zachowania asertywnego

Jeśli uruchomisz aplikację w trybie interfejsu użytkownika, Assert metoda wyświetli okno dialogowe Asercji nie powiodło się, gdy warunek zakończy się niepowodzeniem. Akcje, które występują, gdy asercji kończy się niepowodzeniem, są kontrolowane przez Listeners właściwość or Listeners .

Zachowanie danych wyjściowych można dostosować, dodając TraceListener obiekt do Listeners kolekcji, usuwając obiekt TraceListener z Listeners kolekcji lub przez zastąpienie System.Diagnostics.TraceListener.Fail metody istniejącej TraceListener , aby zachowywała się inaczej.

Można na przykład zastąpić metodę zapisywania System.Diagnostics.TraceListener.Fail w dzienniku zdarzeń zamiast wyświetlania okna dialogowego Asercji nie powiodło się .

Aby dostosować dane wyjściowe w ten sposób, program musi zawierać odbiornik i należy dziedziczyć TraceListener i zastąpić jego System.Diagnostics.TraceListener.Fail metodę.

Aby uzyskać więcej informacji, zobacz Śledzenie odbiorników.

W tym temacie

Ustawianie asercji w plikach konfiguracji

Asercji można ustawić w pliku konfiguracji programu, a także w kodzie. Aby uzyskać więcej informacji, zobacz System.Diagnostics.Trace.Assert lub System.Diagnostics.Debug.Assert.