2015-08-24 11 views
6

Nó hiểu rằng nếu xác nhận là sai rằng Debug.Assert sẽ ném chứ không phải là tiếp tục và do đó nó biết khẳng định là đúng qua điểm đó.Có cách nào để làm cho Resharper điều trị Trace.Assert như Debug.Assert?

Tôi muốn có cùng một lý do cho Trace.Assert. Vâng, bạn có thể tiếp tục, nếu bạn tiếp tục qua một cảnh báo như vậy và sau đó ném vào một null đó là vấn đề của bạn. Tôi muốn loại bỏ những thông điệp tham chiếu null có thể giả mạo đó.

+0

"Debug.Assert sẽ ném" là tuyên bố sai ... –

+0

@AlexeiLevenkov Tất nhiên nó chỉ ném nếu có vấn đề. Tôi đang nói về bảo vệ. –

+0

Bạn thực sự có nghĩa là: nếu nó được xây dựng DEBUG * và * truy tìm cấu hình với tất cả mặc định * và * tuyên bố là sai ... (chỉ làm rõ) –

Trả lời

7

tôi chỉ thử nghiệm điều này trong ReSharper 9.1.3 với mã mẫu sau.

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

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

R # báo cáo cho cả Debug.Assert()Trace.Assert() rằng cuộc gọi Console.WriteLine() là "heuristically unreachable". Đây là trường hợp vì cả hai phương thức đều được chú thích trong số external annotations của ReSharper với [ContractAnnotation("condition:false=>halt")] (bạn có thể thấy điều này bằng cách nhấn Ctrl + Shift + F1 trên phương thức và nhấp vào "[...]").

Bạn có phiên bản ReSharper/gói chú thích bên ngoài nào?

BTW: Các condition:false=>halt chú thích là không thực sự chính xác bởi vì a) bạn có thể bấm vào nút "Bỏ qua" trong hộp DefaultTraceListener nhắn và thực hiện sẽ tiếp tục và b) nó phụ thuộc vào cấu hình Trace.Listeners (ví dụ nếu bạn gọi Trace.Listeners.Clear() hoặc đặt AssertUiEnabled bất động sản để sai hộp tin nhắn thậm chí sẽ không xuất hiện).

+0

Awwww ... Tôi đã không nhận thấy 'Trace.Assert' đã được chú thích quá, Tôi không bận tâm kiểm tra: - \ –

+0

Có lẽ họ đã thêm vào 'Dấu vết.Assert' chú thích gần đây và OP chỉ là một gói chú thích bên ngoài đã lỗi thời ... – ulrichb

+0

Bạn nói đúng. Tôi đã hủy xóa câu trả lời của mình trong trường hợp OP muốn thêm chú thích. –

4

Điều này hoạt động trên ReSharper 9.2.

Trong trường hợp các phiên bản của ReSharper không có chú thích trên Trace.Assert:

Bạn sẽ cần annotation attribute sau trên Trace.Assert phương pháp:

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

Mà nói ReSharper rằng nếu tham số conditionfalse, phương pháp sẽ không trả lại bình thường (halt).

Vâng, đây là những gì bạn muốn đặt trong mã của riêng bạn nếu bạn là tác giả của phương pháp. Nhưng bạn không thể chỉ cần chèn thuộc tính vào System.dll.

Bạn có thể sử dụng external annotations. Với những, bạn sẽ phải viết một số 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> 

Các help page tôi liên kết với giải thích làm thế nào để cài đặt này để ReSharper.

Hoặc ... Bạn có thể viết phương pháp Assert của riêng bạn trong lớp helper của riêng bạn, mà chỉ có các đại biểu đến Trace.Assert, vì vậy bạn có thể sử dụng thuộc tính:

[ContractAnnotation("condition:false=>halt")] 
public static void Assert(bool condition) 
{ 
    Trace.Assert(condition); 
} 
Các vấn đề liên quan