Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un'asserzione, o istruzione Assert
, verifica una condizione specificata come argomento dell'istruzione Assert
. Se la condizione restituisce true, non viene eseguita alcuna azione. Se restituisce false, l'asserzione ha esito negativo. Se è in esecuzione una build di debug, il programma passa alla modalità di interruzione.
In questo argomento
Asserzioni nel namespace System.Diagnostics
Metodo Debug.Assert
Effetti collaterali di Debug.Assert
Requisiti di tracciamento e debug
Personalizzazione del comportamento di Asserzione
Impostazione delle asserzioni nei file di configurazione
Asserzioni nello spazio dei nomi System.Diagnostics
In Visual Basic e Visual C# è possibile usare il metodo Assert
da Debug o Trace, che si trovano nel namespace System.Diagnostics.
Debug I metodi di classe non sono inclusi in una versione Release del programma, quindi non aumentano le dimensioni o riducono la velocità del codice di rilascio.
C++ non supporta i metodi della Debug classe. È possibile ottenere lo stesso effetto usando la classe con la Trace compilazione condizionale, ad esempio #ifdef DEBUG
... #endif
.
Metodo Debug.Assert
Utilizzare il metodo System.Diagnostics.Debug.Assert per verificare le condizioni che devono restituire true se il codice è corretto. Si supponga, ad esempio, di aver scritto una funzione di divisione integer. In base alle regole matematiche, il divisore non può mai essere zero. È possibile testarlo usando un'asserzione:
int IntegerDivide ( int dividend , int divisor )
{
Debug.Assert ( divisor != 0 );
return ( dividend / divisor );
}
Quando si esegue questo codice nel debugger, l'istruzione di asserzione viene valutata, ma nella versione Release il confronto non viene eseguito, quindi non è previsto alcun sovraccarico aggiuntivo.
Ecco un altro esempio. Hai una classe che implementa un conto corrente, come indicato di seguito:
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
Prima di ritirare denaro dal conto, si desidera assicurarsi che il saldo del conto sia sufficiente per coprire l'importo che si sta preparando a ritirare. È possibile scrivere un'asserzione per controllare il saldo:
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
Si noti che le chiamate al System.Diagnostics.Debug.Assert metodo scompaiono quando si crea una versione Release del codice. Ciò significa che la chiamata che controlla il saldo scompare nella versione release. Per risolvere questo problema, è necessario sostituire System.Diagnostics.Debug.Assert con System.Diagnostics.Trace.Assert, che non scompare nella versione di rilascio:
Le chiamate a System.Diagnostics.Trace.Assert aggiungono overhead alla tua versione Release, diversamente dalle chiamate a System.Diagnostics.Debug.Assert.
Effetti collaterali di Debug.Assert
Quando si usa System.Diagnostics.Debug.Assert, assicurarsi che qualsiasi codice all'interno Assert
non modifichi i risultati del programma se Assert
viene rimosso. In caso contrario, è possibile introdurre accidentalmente un bug che viene visualizzato solo nella versione release del programma. Prestare particolare attenzione alle asserzioni che contengono chiamate di funzione o di routine, ad esempio l'esempio seguente:
Questo uso di System.Diagnostics.Debug.Assert potrebbe apparire sicuro a prima vista, ma si supponga che la funzione meas aggiorni un contatore ogni volta che viene chiamato. Quando si compila la versione release, questa chiamata a meas viene eliminata, quindi il contatore non viene aggiornato. Questo è un esempio di una funzione con un effetto collaterale. L'eliminazione di una chiamata a una funzione con effetti collaterali potrebbe causare un bug visualizzato solo nella versione release. Per evitare questi problemi, non inserire chiamate di funzione in un'istruzione System.Diagnostics.Debug.Assert . Usare invece una variabile temporanea:
Anche quando si usa System.Diagnostics.Trace.Assert, è comunque consigliabile evitare di inserire chiamate di funzione all'interno di un'istruzione Assert
. Queste chiamate devono essere sicure, perché System.Diagnostics.Trace.Assert le istruzioni non vengono eliminate in una versione di rilascio. Tuttavia, se si evitano tali costrutti come abitudine, è meno probabile che si commette un errore quando si usa System.Diagnostics.Debug.Assert.
Requisiti per la tracciatura e il debug
Se si crea il progetto usando le procedure guidate di Visual Studio, il simbolo TRACE viene definito per impostazione predefinita nelle configurazioni Release e Debug. Il simbolo DEBUG è definito per impostazione predefinita solo nella build di debug.
In caso contrario, affinché Trace i metodi funzionino, il programma deve avere uno dei seguenti elementi all'inizio del file di origine:
#Const TRACE = True
in Visual Basic#define TRACE
in Visual C# e C++In alternativa, il programma deve essere compilato con l'opzione TRACE:
/d:TRACE=True
in Visual Basic/d:TRACE
in Visual C# e C++Se è necessario usare i metodi Debug in una build di versione C# o Visual Basic, è necessario definire il simbolo DEBUG nella configurazione release.
C++ non supporta i metodi della Debug classe. È possibile ottenere lo stesso effetto usando la classe con la Trace compilazione condizionale, ad esempio
#ifdef DEBUG
...#endif
. È possibile definire questi simboli nella finestra di dialogo Pagine delle proprietà del< progetto>. Per altre informazioni, vedere Modifica delle impostazioni del progetto per una configurazione di debug di Visual Basic o Modifica delle impostazioni del progetto per una configurazione di debug C o C++.
Verificare gli argomenti
System.Diagnostics.Trace.Assert e System.Diagnostics.Debug.Assert accettano fino a tre argomenti. Il primo argomento, obbligatorio, è la condizione da controllare. Se si chiama System.Diagnostics.Trace.Assert(Boolean) o System.Diagnostics.Debug.Assert(Boolean) con un solo argomento, il Assert
metodo controlla la condizione e, se il risultato è false, restituisce il contenuto dello stack di chiamate nella finestra Output . L'esempio seguente mostra System.Diagnostics.Trace.Assert(Boolean) e System.Diagnostics.Debug.Assert(Boolean):
Il secondo e il terzo argomento, se presenti, devono essere stringhe. Se si chiama System.Diagnostics.Trace.Assert o System.Diagnostics.Debug.Assert con due o tre argomenti, il primo argomento è una condizione. Il metodo controlla la condizione e, se il risultato è false, restituisce la seconda stringa e la terza stringa. Nell'esempio seguente vengono mostrati System.Diagnostics.Debug.Assert(Boolean, String) e System.Diagnostics.Trace.Assert(Boolean, String) usati con due argomenti:
Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );
Nell'esempio seguente vengono mostrati System.Diagnostics.Debug.Assert(Boolean, String, String) e System.Diagnostics.Trace.Assert(Boolean, String, String) usati con tre argomenti.
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );
Personalizzazione del comportamento di Assert
Se si esegue l'applicazione in modalità interfaccia utente, il Assert
metodo visualizza la finestra di dialogo Asserzione non riuscita quando la condizione ha esito negativo. Le azioni che si verificano quando un'asserzione non riesce vengono controllate dalla Listeners proprietà o Listeners .
È possibile personalizzare il comportamento di output aggiungendo un TraceListener oggetto alla Listeners
raccolta, rimuovendo un TraceListener oggetto dalla raccolta o eseguendo l'override Listeners
del System.Diagnostics.TraceListener.Fail metodo di un oggetto esistente TraceListener
per renderlo diverso.
Ad esempio, è possibile eseguire l'override del System.Diagnostics.TraceListener.Fail metodo per scrivere in un registro eventi anziché visualizzare la finestra di dialogo Asserzione non riuscita .
Per personalizzare l'output in questo modo, il programma deve contenere un listener ed è necessario ereditare da TraceListener ed eseguire l'override del relativo System.Diagnostics.TraceListener.Fail metodo.
Per ulteriori informazioni, vedere Listener di traccia.
Impostazione delle asserzioni nei file di configurazione
È possibile impostare asserzioni nel file di configurazione del programma e nel codice. Per altre informazioni, vedere System.Diagnostics.Trace.Assert o System.Diagnostics.Debug.Assert.