它理解如果断言为假,Debug.Assert将抛出而不是继续,因此它知道断言在此之后是真的。
我喜欢Trace.Assert的相同推理。是的,你可以继续,如果你继续经过这样一个警告,然后它会抛出一个你的问题。我想摆脱那些虚假的可能的空引用消息。
答案 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=>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=>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=>halt</argument>
</attribute>
</member>
</assembly>
我链接的help page解释了如何将其安装到ReSharper。
或者......您可以在自己的帮助程序类中编写自己的Assert
方法,该方法仅委托给Trace.Assert
,因此您可以使用以下属性:
[ContractAnnotation("condition:false=>halt")]
public static void Assert(bool condition)
{
Trace.Assert(condition);
}