Sdílet prostřednictvím


Kontrolní výrazy ve spravovaném kódu

Kontrolní příkaz – neboli příkaz Assert – testuje podmínku, kterou zadáte jako argument příkazu Assert. Pokud je tato podmínka vyhodnocena jako true, nedojde k žádné akci. Pokud je tato podmínka vyhodnocena jako false, kontrola selže. Pokud máte spuštěný build pro ladění, přejde program do režimu pozastavení.

V tomto tématu

Asserts in the System.Diagnostics Namespace

Metoda Debug.Assert

Vedlejší účinky debug.Assert

Požadavky na trasování a ladění

Argumenty assert

Přizpůsobení chování Assert

Nastavení kontrolních výrazů v konfiguračních souborech

Asserts in the System.Diagnostics Namespace

V jazyce Visual Basic a Visual C# můžete použít metodu Assert z oboru Debug názvů nebo TraceSystem.Diagnostics z oboru názvů. Debug Metody tříd nejsou součástí verze vašeho programu, takže nezvětšují velikost ani nezmenšují rychlost kódu vydané verze.

C++ nepodporuje Debug metody třídy. Stejný účinek můžete dosáhnout pomocí Trace třídy s podmíněnou kompilací, například #ifdef DEBUG... #endif.

V tomto tématu

Metoda Debug.Assert

Metodu System.Diagnostics.Debug.Assert použijte volně k testování podmínek, které by měly být splněny, pokud je váš kód správný. Předpokládejme například, že jste napsali funkci pro dělení celých čísel. Podle matematických pravidel nemůže být dělitel nikdy nula. Můžete to otestovat pomocí kontrolního příkazu:

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

Když spustíte tento kód v ladicím programu, je kontrolní příkaz vyhodnocen, ale ve vydané verzi se toto porovnání neprovádí, takže nedochází k žádnému dodatečnému zatížení.

Následuje další příklad. Máte třídu, která implementuje kontrolní účet následujícím způsobem:

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

Před stažením peněz z účtu chcete mít jistotu, že zůstatek na účtu stačí k pokrytí částky, kterou připravujete na výběr. Můžete napsat kontrolní výraz pro kontrolu zůstatku:

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

Všimněte si, že volání metody System.Diagnostics.Debug.Assert zmizí, když vytvoříte verzi vydané verze kódu. To znamená, že volání, které kontroluje zůstatek zmizí ve verzi vydané verze. Chcete-li tento problém vyřešit, měli byste nahradit System.Diagnostics.Debug.Assert , System.Diagnostics.Trace.Assertkterý nezmizí ve verzi vydané verze:

Volání, která přidají System.Diagnostics.Trace.Assert režijní náklady na vaši verzi vydané verze, na rozdíl od volání System.Diagnostics.Debug.Assert.

V tomto tématu

Vedlejší účinky debug.Assert

Při použití System.Diagnostics.Debug.Assertse ujistěte, že jakýkoli kód uvnitř Assert programu nezmění výsledky programu, pokud Assert je odebrán. Jinak byste mohli náhodně zavést chybu, která se projeví pouze ve vydané verzi vašeho programu. Dávejte pozor zejména na kontrolní výrazy, které obsahují volání funkce nebo procedury, například v následujícím příkladu:

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

Toto použití System.Diagnostics.Debug.Assert může být na první pohled bezpečné, ale předpokládejme, že funkce meas aktualizuje čítač pokaždé, když je volána. Když sestavíte verzi vydané verze, toto volání meas se eliminuje, takže se čítač neaktualizuje. Toto je příklad funkce s vedlejším účinkem. Odstranění volání funkce, která má vedlejší účinky, může vést k chybě, která se zobrazí pouze ve verzi vydané verze. Abyste se těmto problémům vyhnuli, neumisťujte volání funkcí do System.Diagnostics.Debug.Assert příkazu. Místo toho použijte dočasnou proměnnou:

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

I když použijete System.Diagnostics.Trace.Assert, můžete se přesto chtít vyhnout umístění volání funkce do Assert příkazu. Taková volání by měla být bezpečná, protože System.Diagnostics.Trace.Assert příkazy se v buildu vydané verze neodstraní. Pokud se však takovým konstruktorům vyhnete ve zvyku, budete méně pravděpodobné, že při použití System.Diagnostics.Debug.Assertuděláte chybu .

V tomto tématu

Požadavky na trasování a ladění

Pokud projekt vytvoříte pomocí průvodců sadou Visual Studio, je ve výchozím nastavení definován symbol TRACE v konfiguracích vydané verze i ladění. Symbol DEBUG je ve výchozím nastavení definován pouze v sestavení ladění.

Trace V opačném případě musí mít váš program v horní části zdrojového souboru jednu z následujících možností:

  • #Const TRACE = True v jazyce Visual Basic

  • #define TRACE v jazyce Visual C# a C++

    Nebo váš program musí být sestaven pomocí možnosti TRACE:

  • /d:TRACE=True v jazyce Visual Basic

  • /d:TRACE v jazyce Visual C# a C++

    Pokud potřebujete použít metody ladění v sestavení jazyka C# nebo Visual Basic Release, je nutné definovat symbol DEBUG v konfiguraci vydané verze.

    C++ nepodporuje Debug metody třídy. Stejný účinek můžete dosáhnout pomocí Trace třídy s podmíněnou kompilací, například #ifdef DEBUG... #endif. Tyto symboly můžete definovat v <dialogovém okně Stránky vlastností projektu>. Další informace naleznete v tématu Změna projektu Nastavení konfigurace ladění jazyka Visual Basic nebo změna projektu Nastavení pro konfiguraci ladění jazyka C nebo C++.

Argumenty assert

System.Diagnostics.Trace.Assert a System.Diagnostics.Debug.Assert vezměte až tři argumenty. První argument, který je povinný, je podmínka, kterou chcete zkontrolovat. Pokud voláte System.Diagnostics.Trace.Assert(Boolean) nebo System.Diagnostics.Debug.Assert(Boolean) používáte pouze jeden argument, Assert metoda zkontroluje podmínku a pokud je výsledek nepravdivý, vypíše obsah zásobníku volání do okna Výstup . Následující příklad ukazuje System.Diagnostics.Trace.Assert(Boolean) a System.Diagnostics.Debug.Assert(Boolean):

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

Druhý a třetí argument, pokud existuje, musí být řetězce. Pokud voláte System.Diagnostics.Trace.Assert nebo System.Diagnostics.Debug.Assert používáte dva nebo tři argumenty, je prvním argumentem podmínka. Metoda zkontroluje podmínku a pokud je výsledek nepravda, vypíše druhý řetězec a třetí řetězce. Následující příklad ukazuje System.Diagnostics.Debug.Assert(Boolean, String) a System.Diagnostics.Trace.Assert(Boolean, String) používá se se dvěma argumenty:

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

Následující příklad ukazuje System.Diagnostics.Debug.Assert(Boolean, String, String) a System.Diagnostics.Trace.Assert(Boolean, String, String) používá se se třemi argumenty:

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

V tomto tématu

Přizpůsobení chování Assert

Pokud spustíte aplikaci v režimu uživatelského rozhraní, Assert zobrazí metoda dialogové okno Kontrolní výraz se nezdařilo , když podmínka selže. Akce, ke kterým dochází v případě selhání kontrolního výrazu, jsou řízeny Listeners vlastností nebo Listeners vlastností.

Chování výstupu můžete přizpůsobit přidáním TraceListener objektu Listeners do kolekce, odebráním TraceListener kolekce Listeners nebo přepsáním System.Diagnostics.TraceListener.Fail metody existujícího TraceListener objektu, aby se choval jinak.

Můžete například přepsat metodu System.Diagnostics.TraceListener.Fail zápisu do protokolu událostí místo zobrazení dialogového okna Kontrolní výraz Failed .

Chcete-li tímto způsobem přizpůsobit výstup, musí program obsahovat naslouchací proces a musíte zdědit a TraceListener přepsat jeho System.Diagnostics.TraceListener.Fail metodu.

Další informace naleznete v tématu Naslouchací procesy trasování.

V tomto tématu

Nastavení kontrolních výrazů v konfiguračních souborech

Kontrolní výrazy můžete nastavit v konfiguračním souboru programu i v kódu. Další informace naleznete v tématech System.Diagnostics.Trace.Assert a System.Diagnostics.Debug.Assert.