2015-08-24 12 views
6

Rozumie, że jeśli asercja jest fałszywa, to Debug.Assert będzie raczej rzucał niż kontynuował i dlatego wie, że asercja jest prawdziwa po tym punkcie.Czy istnieje sposób, aby Resharper traktować Trace.Assert jak Debug.Assert?

Chciałbym to samo rozumowanie dla Trace.Assert. Tak, możesz kontynuować, jeśli będziesz kontynuował takie ostrzeżenie, a następnie rzuci na zero, to twój problem. Chcę pozbyć się tych fałszywych możliwych komunikatów o wartości zerowej.

+0

"Debug.Assert wrzuci" to nieprawdziwe oświadczenie ... –

+0

@AlexeiLevenkov Oczywiście, że tylko zgłasza, jeśli wystąpił problem. Mówię o strażnikach. –

+0

Naprawdę masz na myśli: jeśli jest to DEBUG kompilacja * i * śledzenie skonfigurowane z domyślnymi ustawieniami * i * instrukcja jest nieprawdziwa ... (tylko wyjaśnienie) –

Odpowiedz

7

Właśnie przetestowane w ReSharper 9.1.3 z następującym kodem przykładowym.

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

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

R # zgłaszane zarówno Debug.Assert() i Trace.Assert() że wezwanie Console.WriteLine() jest "heurystycznie nieosiągalny". Dzieje się tak, ponieważ obie metody zostały opisane w ReSharper's external annotations z [ContractAnnotation("condition:false=>halt")] (możesz to zobaczyć naciskając Ctrl + Shift + F1 na metodę i klikając "[...]").

Którą wersję pakietu ReSharper/z zewnętrznej adnotacji masz?

BTW: The condition:false=>halt adnotacja nie jest do końca poprawne, ponieważ a) można kliknąć przycisk „Ignoruj” w polu DefaultTraceListener komunikatów i wykonanie będzie nadal ib) to zależy od konfiguracji Trace.Listeners (np jeśli zadzwonisz Trace.Listeners.Clear() lub ustawić AssertUiEnabled właściwość false, okno komunikatu nie pojawi się nawet).

+0

Awwww ... Nie zauważyłem, że 'Trace.Assert' został również opatrzony przypisami, Nie zadałem sobie trudu, by sprawdzić: - \ –

+0

Może dodali "Ślad".Adnotacje asemblera, a OP ma nieaktualny zewnętrzny pakiet adnotacji ... – ulrichb

+0

Masz rację. Usunąłem odpowiedź na wypadek, gdyby OP chciał dodać adnotację. –

4

Działa to w przypadku ReSharper 9.2.

W przypadku, gdy wersja ReSharper nie ma adnotacji o Trace.Assert:

należałoby następujące annotation attribute na metodzie Trace.Assert:

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

który mówi, że jeśli ReSharper parametru condition to jest false, metoda nie powróci normalnie (halt).

Cóż, to jest to, co chcesz umieścić w swoim własnym kodzie, jeśli jesteś autorem metody. Ale nie możesz po prostu wstawić atrybutu do System.dll.

Można jednak użyć external annotations. Z nich, będziesz musiał napisać 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> 

help page I związana wyjaśnia, jak zainstalować to ReSharper.

Albo ... Możesz napisać własną metodę Assert w swojej własnej klasy pomocnika, który tylko delegatów Trace.Assert, więc można użyć atrybutu:

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