有没有办法让Resharper像Debug.Assert一样处理Trace.Assert?

时间:2015-08-24 20:54:41

标签: c# resharper

它理解如果断言为假,Debug.Assert将抛出而不是继续,因此它知道断言在此之后是真的。

我喜欢Trace.Assert的相同推理。是的,你可以继续,如果你继续经过这样一个警告,然后它会抛出一个你的问题。我想摆脱那些虚假的可能的空引用消息。

2 个答案:

答案 0 :(得分:8)

我刚刚使用以下示例代码在ReSharper 9.1.3中对此进行了测试。

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

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

报告了Debug.Assert()Trace.Assert()的R#Console.WriteLine()来电是"启发式无法访问"。情况就是如此,因为这两种方法都在ReSharper的external annotations中使用[ContractAnnotation("condition:false=>halt")]进行了注释(您可以通过按Ctrl + Shift + F1并点击" [。 ..]"。)

您拥有哪个版本的ReSharper /外部注释包?

顺便说一句:condition:false=>halt注释并不正确,因为a)你可以点击"忽略"在DefaultTraceListener消息框中,执行将继续,b)它取决于Trace.Listeners配置(例如,如果您调用Trace.Listeners.Clear()或将AssertUiEnabled属性设置为false消息框甚至不会出现。)

答案 1 :(得分:4)

这适用于ReSharper 9.2。

如果您的ReSharper版本在Trace.Assert上没有注释:

您需要Trace.Assert方法中的以下annotation attribute

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

告诉ReSharper,如果condition参数为false,则该方法将无法正常返回(halt)。

如果您是该方法的作者,那么这就是您在自己的代码中添加的内容。但是,您无法只将属性插入System.dll

但您可以使用external annotations。有了这些,您必须编写一些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解释了如何将其安装到ReSharper。

或者......您可以在自己的帮助程序类中编写自己的Assert方法,该方法仅委托给Trace.Assert,因此您可以使用以下属性:

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