有没有办法向ReSharper表明由于按合同设计需要检查,不会出现空引用?例如,以下代码将Possible 'null' assignment to entity marked with 'NotNull' attribute在第7行和第8行的ReSharper中引发warning():
private Dictionary<string, string> _Lookup = new Dictionary<string, string>();
public void Foo(string s)
{
Contract.Requires(!String.IsNullOrEmpty(s));
if (_Lookup.ContainsKey(s))
_Lookup.Remove(s);
}
Run Code Online (Sandbox Code Playgroud)
真正奇怪的是,如果删除该Contract.Requires(...)行,ReSharper消息就会消失.
更新
我通过ExternalAnnotations找到了解决方案,Mike也在下面提到过.以下是如何在Microsoft.Contracts中为函数执行此操作的示例:
Microsoft.Contracts在ExternalAnnotationsReSharper目录下调用的目录.Microsoft.Contracts.xml并填充如下:<assembly name="Microsoft.Contracts">
<member name="M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean)">
<attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
<parameter name="condition">
<attribute ctor="M:JetBrains.Annotations.AssertionConditionAttribute.#ctor(JetBrains.Annotations.AssertionConditionType)">
<argument>0</argument>
</attribute>
</parameter>
</member>
</assembly>
Run Code Online (Sandbox Code Playgroud)
c# resharper design-by-contract code-contracts microsoft-contracts
我不想完全禁用警告,就像它在Assert语句中一样.
例如,如果我有以下两行
var someObject = GetObject();
Assert.IsNotNull(someObject, "someObject should not be null");
Assert.AreEqual(expectedValue, someObject.SomeProperty);
Run Code Online (Sandbox Code Playgroud)
我将在第二行上获得可能的空引用警告someObject.SomeProperty.是否可以在某个通话中禁用警告,例如Assert.AreEqual?
由于这是很多单元测试的问题,我不想用ReSharper禁用代码乱丢测试.
现在,我能想到的唯一选择就是改变每一个Assert.IsNotNull电话
var someObject = GetObject();
if(someObject == null)
{
Assert.Fail("someObject is null");
return;
}
Run Code Online (Sandbox Code Playgroud)
虽然这种似乎打败Assert.IsNotNull了首先拥有的目的.只是想知道是否有更好的方法.
只是想确定我没有编写太长时间...但是,这似乎不太可能:
http://i.imgur.com/TBjpNTX.png
我创建var,检查null,如果是,则返回,所以我无法在那时看到它为null :)
Resharper bug?
编辑:
根据Igal Tabachnik的回答,他是对的,我正在使用以下方法扩展:
public static bool IsNullOrEmpty(this string target)
{
return String.IsNullOrEmpty(target);
}
Run Code Online (Sandbox Code Playgroud)
我发现它更容易阅读
if (some_string.IsNullOrEmpty())
// do something here
Run Code Online (Sandbox Code Playgroud)
而不是:
if (string.IsNullOrEmpty(some_string))
// do something here
Run Code Online (Sandbox Code Playgroud)
解决方案:
Igal Tabachnik是对的.唯一缺少的2件是: