2015-08-24 9 views
6

Capisce che se l'asserzione è falsa che Debug.Assert getterà piuttosto che continuare e quindi sa che l'affermazione è vera oltre quel punto.Esiste un modo per rendere Tracciatore di risorse Trace.Assert come Debug.Assert?

Mi piacerebbe lo stesso ragionamento per Trace.Assert. Sì, puoi continuare, se continui oltre questo avviso e poi getta su un null che è il tuo problema. Voglio sbarazzarmi di quei falsi possibili riferimenti di riferimento nulli.

+0

"Debug.Assert lancia" è un'affermazione falsa ... –

+0

@AlexeiLevenkov Naturalmente lancia solo se c'è un problema. Sto parlando di guardie. –

+0

Significa veramente: se DEBUG build * e * tracciati configurati con tutti i valori predefiniti * e * l'istruzione è falsa ... (solo chiarificazione) –

risposta

7

Ho appena provato questo in ReSharper 9.1.3 con il seguente codice di esempio.

private void M(string a) 
{ 
    Trace.Assert(a != null); // or Debug.Assert(a != null); 

    if (a == null) 
     Console.WriteLine("a is null"); 
} 

R # riportato sia per Debug.Assert() e Trace.Assert() che la chiamata è Console.WriteLine() "euristico irraggiungibile". Questo è il caso perché entrambi i metodi sono annotati in external annotations di ReSharper con [ContractAnnotation("condition:false=>halt")] (si può vedere premendo Ctrl + Maiusc + F1 sul metodo e facendo clic su "[...]").

Quale versione di ReSharper/del pacchetto delle annotazioni esterne avete?

BTW: Il condition:false=>halt annotazione non è propriamente corretto, perché a) Fare clic su "Ignora" nella casella DefaultTraceListener messaggio e l'esecuzione continuerà e b) dipende dalla configurazione Trace.Listeners (ad esempio, se si chiama Trace.Listeners.Clear() o impostare il AssertUiEnabled proprietà per false la finestra di messaggio non verrà nemmeno visualizzata).

+0

Awwww ... Non ho notato che anche 'Trace.Assert' è stato annotato, Non mi sono preoccupato di controllare: - \ –

+0

Forse hanno aggiunto il 'Trace.Le annotazioni Assert' di recente e l'OP ha solo un pacchetto di annotazione esterno obsoleto ... – ulrichb

+0

Hai ragione. Ho annullato la mia risposta nel caso in cui l'OP desideri aggiungere l'annotazione. –

4

Funziona su ReSharper 9.2.

Nel caso la vostra versione di ReSharper non ha un'annotazione sul Trace.Assert:

Avresti bisogno il seguente annotation attribute sul metodo Trace.Assert:

[ContractAnnotation("condition:false=>halt")] 

che racconta ReSharper che se il parametro condition è false, il metodo non verrà restituito normalmente (halt).

Bene, questo è quello che avresti inserito nel tuo codice se fossi l'autore del metodo. Ma non puoi semplicemente inserire un attributo su System.dll.

Tuttavia è possibile utilizzare external annotations. Con questi, dovrete scrivere qualche XML:

<assembly name="System"> 
    <member name="M:System.Diagnostics.Trace.Assert(System.Boolean)"> 
    <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/> 
    <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)"> 
     <argument>condition:false=&gt;halt</argument> 
    </attribute> 
    </member> 
    <member name="M:System.Diagnostics.Trace.Assert(System.Boolean,System.String)"> 
    <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/> 
    <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)"> 
     <argument>condition:false=&gt;halt</argument> 
    </attribute> 
    </member> 
    <member name="M:System.Diagnostics.Trace.Assert(System.Boolean,System.String,System.String)"> 
    <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/> 
    <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)"> 
     <argument>condition:false=&gt;halt</argument> 
    </attribute> 
    </member> 
</assembly> 

Il help page ho collegato spiega come installare questo per ReSharper.

Oppure ... Si potrebbe scrivere un proprio metodo Assert nella propria classe di supporto, che solo i delegati di Trace.Assert, in modo da poter utilizzare l'attributo:

[ContractAnnotation("condition:false=>halt")] 
public static void Assert(bool condition) 
{ 
    Trace.Assert(condition); 
}