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
Wymagania dotyczące śledzenia i debugowania
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
.
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.
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:
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:
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
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):
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" );
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.
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.