Partilhar via


Asserções em código gerenciado

Uma asserção, ou instrução Assert, testa uma condição, que especifica como um argumento para a instrução Assert. Se a condição for avaliada como verdadeira, não ocorre qualquer ação. Se a condição for avaliada como falsa, a asserção falha. Se estiveres a executar com uma compilação de depuração, o teu programa entra no modo de interrupção.

Neste tópico

Asserts do namespace System.Diagnostics

O método Debug.Assert

Efeitos colaterais de Debug.Assert

Requisitos de rastreamento e depuração

Afirmar argumentos

Personalizando o comportamento Assert

Definindo asserções em arquivos de configuração

Assertivas no namespace System.Diagnostics

No Visual Basic e no Visual C#, você pode usar o método Assert de Debug ou Trace, que estão no espaço de nomes System.Diagnostics. Debug Os métodos de classe não estão incluídos em uma versão Release do seu programa, portanto, eles não aumentam o tamanho ou reduzem a velocidade do seu código de versão.

C++ não suporta os Debug métodos de classe. Você pode obter o mesmo efeito usando a Trace classe com compilação condicional, como #ifdef DEBUG... #endif.

Neste tópico

O método Debug.Assert

Use o método System.Diagnostics.Debug.Assert livremente para testar condições que devem ser verdadeiras se o código estiver correto. Por exemplo, suponha que você tenha escrito uma função de divisão inteira. Pelas regras da matemática, o divisor nunca pode ser zero. Você pode testar isso usando uma asserção:

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

Quando você executa esse código sob o depurador, a instrução de asserção é avaliada, mas na versão Release, a comparação não é feita, portanto, não há sobrecarga adicional.

Eis outro exemplo. Você tem uma classe que implementa uma conta corrente, da seguinte maneira:

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

Antes de retirar dinheiro da conta, você quer ter certeza de que o saldo da conta é suficiente para cobrir o valor que você está se preparando para sacar. Você pode escrever uma asserção para verificar o saldo:

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

Observe que as chamadas para o System.Diagnostics.Debug.Assert método desaparecem quando você cria uma versão Release do seu código. Isso significa que a chamada que verifica o saldo desaparece na versão de lançamento. Para resolver esse problema, você deve substituir System.Diagnostics.Debug.Assert por System.Diagnostics.Trace.Assert, que não desaparece na versão de lançamento:

Chamadas para System.Diagnostics.Trace.Assert adicionam uma sobrecarga à sua versão Release, ao contrário das chamadas para System.Diagnostics.Debug.Assert.

Neste tópico

Efeitos colaterais de Debug.Assert

Ao utilizar System.Diagnostics.Debug.Assert, certifique-se de que o código dentro de Assert não modifique os resultados do programa se Assert for removido. Caso contrário, você pode acidentalmente introduzir um bug que só aparece na versão Release do seu programa. Tenha especial cuidado com asserções que contenham chamadas de função ou procedimento, como o exemplo a seguir:

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

Este uso de System.Diagnostics.Debug.Assert pode parecer seguro à primeira vista, mas suponha que a função meas atualiza um contador cada vez que é chamado. Quando você cria a versão de lançamento, essa chamada para meas é eliminada, para que o contador não seja atualizado. Este é um exemplo de uma função com um efeito colateral. Eliminar uma chamada para uma função que tem efeitos colaterais pode resultar em um bug que só aparece na versão de lançamento. Para evitar esses problemas, não coloque chamadas de função numa System.Diagnostics.Debug.Assert declaração. Em vez disso, use uma variável temporária:

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

Mesmo quando usas System.Diagnostics.Trace.Assert, ainda podes querer evitar colocar chamadas de função dentro de uma instrução Assert. Essas chamadas devem ser seguras, porque System.Diagnostics.Trace.Assert as instruções não são eliminadas em uma compilação de versão. No entanto, se você evitar tais construções por uma questão de hábito, é menos provável que cometa um erro quando você usa System.Diagnostics.Debug.Assert.

Neste tópico

Requisitos de seguimento e depuração

Se você criar seu projeto usando os assistentes do Visual Studio, o símbolo TRACE será definido por padrão nas configurações Release e Debug. O símbolo DEBUG é definido por padrão somente na compilação Debug.

Caso contrário, para que os Trace métodos funcionem corretamente, o programa deve ter uma das seguintes opções no topo do arquivo de origem:

Afirmar argumentos

System.Diagnostics.Trace.Assert e System.Diagnostics.Debug.Assert aceitam até três argumentos. O primeiro argumento, que é obrigatório, é a condição que você deseja verificar. Se você chamar System.Diagnostics.Trace.Assert(Boolean) ou System.Diagnostics.Debug.Assert(Boolean) com apenas um argumento, o método verificará Assert a condição e, se o resultado for falso, enviará o conteúdo da pilha de chamadas para a janela Saída . O exemplo a seguir mostra System.Diagnostics.Trace.Assert(Boolean) e System.Diagnostics.Debug.Assert(Boolean):

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

O segundo e terceiro argumentos, se presentes, devem ser strings. Se chamar System.Diagnostics.Trace.Assert ou System.Diagnostics.Debug.Assert com dois ou três argumentos, o primeiro argumento é uma condição. O método verifica a condição e, se o resultado for falso, gera a segunda e a terceira cadeias de caracteres. O exemplo a seguir mostra System.Diagnostics.Debug.Assert(Boolean, String) e System.Diagnostics.Trace.Assert(Boolean, String) é usado com dois argumentos:

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

O exemplo a seguir mostra System.Diagnostics.Debug.Assert(Boolean, String, String) e System.Diagnostics.Trace.Assert(Boolean, String, String) é usado com três argumentos:

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

Neste tópico

Personalizando o comportamento Assert

Se você executar seu aplicativo no modo de interface do usuário, o Assert método exibirá a caixa de diálogo Assertion Failed quando a condição falhar. As ações que ocorrem quando uma asserção falha são controladas pela propriedade Listeners ou Listeners.

Você pode personalizar o comportamento de saída adicionando um TraceListener objeto à Listeners coleção, removendo um TraceListener da Listeners coleção ou substituindo o System.Diagnostics.TraceListener.Fail método de um existente TraceListener para que ele se comporte de forma diferente.

Por exemplo, pode sobrescrever o método System.Diagnostics.TraceListener.Fail para, em vez de exibir a caixa de diálogo Assertion Failed, gravar em um log de eventos.

Para personalizar a saída dessa maneira, seu programa deve conter um escuta, e você deve herdar de TraceListener e sobrescrever o seu System.Diagnostics.TraceListener.Fail método.

Para obter mais informações, consulte Rastrear ouvintes.

Neste tópico

Definindo asserções em arquivos de configuração

Você pode definir asserções no arquivo de configuração do programa, bem como no código. Para obter mais informações, consulte System.Diagnostics.Trace.Assert ou System.Diagnostics.Debug.Assert.