2015-08-24 11 views
6

Bu iddia, Debug.Assert'in devam etmekten ziyade atağı yanlış yapması ve bu noktada iddianın doğru olduğunu bilir.Resharper'ın Trace.Assert'i Debug.Assert gibi ele almasının bir yolu var mı?

Trace.Assert için aynı gerekçeyi kullanmak istiyorum. Evet, devam edebilirsin, eğer böyle bir uyarıya devam edersen, ve o zaman senin sorunun olan bir boşluğa atılır. Bu sahte null referans mesajlarından kurtulmak istiyorum.

+0

"Debug.Assert atılacak" yanlış bir ifadedir ... –

+0

@AlexeiLevenkov Elbette ki sorun varsa atıyor. Muhafızlardan bahsediyorum. –

+0

Gerçekten kastediyorsunuz: DEBUG yapılıyorsa * ve * tüm varsayılanlar ile yapılandırılmış * ve * ifadesi yanlıştır ... (sadece açıklama) –

cevap

7

Aşağıdaki örnek kod ile.

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

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

R # Debug.Assert() ve Console.WriteLine() çağrısı "sezgisel ulaşılmaz" dir Trace.Assert() ikisi için bildirdiler. Bu durum, ReSharper'ın external annotations numaralı telefonunda [ContractAnnotation("condition:false=>halt")] ile her iki yönteme de açıklık getirildiğinden (Ctrl + Shift + F1 yöntemine vurarak ve "[...]" üzerine tıklayarak bunu görebilirsiniz).

Harici ek açıklama paketinin ReSharper/sürümünü hangi sürüme sahipsiniz? BTW

: a) tıklayın "Yoksay" DefaultTraceListener mesaj kutusunda ve yürütme devam edecek ve b) Trace.Listeners yapılandırmasına bağlıdır çünkü condition:false=>halt ek açıklama gerçekten doğru değil (örneğin siz Trace.Listeners.Clear() arayabilir veya AssertUiEnabled ayarlarsanız false özelliği mesaj kutusu bile görünmeyecektir).

+0

Awww ... Trace.Assert’in de açıklamalı olduğunu fark etmedim. Kontrol etmedim: - \ –

+0

Belki Trace eklediler.Son zamanlarda Assert' ek açıklamaları ve OP sadece modası geçmiş bir dış ek açıklama paketi var ... – ulrichb

+0

Haklısınız. OP'nin açıklama eklemek istediği durumlarda cevabımı geri aldım. –

4

Bu ReSharper 9.2 üzerinde çalışır.

Sen Trace.Assert yöntemine aşağıdaki annotation attribute gerekir:: ReSharper sürümünüz Trace.Assert ek açıklama bulunmamaktadır durumda

ReSharper söyler

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

olduğunu condition parametre ise false, yöntem normal olarak geri dönmeyecek (halt).

Eğer yöntemin yazarı olsaydınız, kendi kodunuza koyacağınız şey budur. Ancak, System.dll'a bir özellik ekleyemezsiniz.

external annotations'u kullanabilirsiniz. Bunlarla bazı XML yazmak gerekecek:

<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> 

Ben bağlantılı help page ReSharper bu nasıl kurulduğunu açıklar.

Ya da ... Kendi yardımcı sınıf, sadece delegeler Trace.Assert için kendi Assert yöntem yazabilirsiniz, böylece özelliğini kullanabilirsiniz: Sadece ReSharper 9.1.3 bu test

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