Resharper 警告空字符串 (System.NullReferenceException)

Posted

技术标签:

【中文标题】Resharper 警告空字符串 (System.NullReferenceException)【英文标题】:Resharper warns about a null string (System.NullReferenceException) 【发布时间】:2014-06-17 18:05:06 【问题描述】:

只是想确定我没有编码太久......但是,这似乎不太可能:

http://i.imgur.com/TBjpNTX.png

我创建了 var,检查是否为 null,如果是则返回,所以我无法在那时将其视为 null :)

Resharper 错误?

编辑: 根据 Igal Tabachnik 的回答,他是对的,我正在使用以下方法扩展:

public static bool IsNullOrEmpty(this string target)

    return String.IsNullOrEmpty(target);

我发现它更容易阅读

if (some_string.IsNullOrEmpty())
  // do something here 

而不是:

if (string.IsNullOrEmpty(some_string))
  // do something here 

解决方案:Igal Tabachnik 是对的。唯一缺少的两件是:

    Resharper -> 选项 -> 代码注释(在代码检查组下)-> 打开解决方案。 给 VS 几分钟时间来刷新一切。

【问题讨论】:

这不是错误。 ReSharper NullReferenceException Analysis and Its Contracts 还有:ReSharper: how to remove “Possible 'System.NullReferenceException'” warning 【参考方案1】:

您的代码表明您使用的IsNullOrEmpty() 方法是您自己的自定义扩展方法。 “真正的”IsNullOrEmptystring 的静态方法。

简短回答:如果您将其更改为

if (string.IsNullOrEmpty(input_string))
    return "...";

ReSharper 将停止抱怨。

长答案:由于这是您自己的扩展方法,ReSharper 无法知道此方法的结果如何应用于您的代码。为此,ReSharper 使用代码注释来找出有关代码的其他信息。一个这样的注释称为Contract Annotation,它是ReSharper 用来计算原始string.IsNullOrEmpty() 方法的结果的。您可以在博文中了解更多信息。

归根结底,如果您想使用自己的扩展方法,但让 ReSharper 正确理解它,则必须对其应用以下 Contract Annotation:

[ContractAnnotation("null=>true")]
public static bool IsNullOrEmpty(this string input)

    ...

【讨论】:

+1 用于解决问题,同时保留他原来的扩展方法。还有豪猪树;) 哇,非常好的解决方案。肯定 +1。 这非常有趣:)。你的第一个建议是 100% 的钱,使用 'string.IsNullOrEmpty(my_string)' 摆脱它。用我的代码更新了问题。扩展方法上的注释虽然不会使警告消失。我会去阅读你发布的链接:)不管怎样,答案都很好。 已编辑的答案,看来你是对的,但额外的步骤是在 resharper 中设置选项。赞一个。【参考方案2】:

您的IsNullOrEmpty() 方法似乎是自己的发明,因为最初的方法是System.String 的静态方法,而不是扩展方法。 ReSharper 无法解决这个问题,但如果您使用原始版本,它会发现没有 null-values 可以让它过去。

var str = value as string;

if (string.IsNullOrEmpty(str))
    return;

var unicorn = str.Contains("unicorn");

【讨论】:

确保在 String.IsNullOrEmpty 处使用大写的“S” @Matthijs 为什么?两者都完全有效并编译为System.String @dav_i:我发誓我刚刚看到 IsNullOrEmpty 不适用于小写字符串。我的错,对不起!

以上是关于Resharper 警告空字符串 (System.NullReferenceException)的主要内容,如果未能解决你的问题,请参考以下文章

修改 ReSharper 中的关闭警告

Resharper 中的警告“未使用纯方法的返回值”

如何修复:在闭包 resharper 警告中访问 foreach 变量?

ReSharper 警告:“泛型类型的静态字段”

重载的方法在 Resharper 中给出“带有可选参数的方法被重载隐藏”警告

Django和Bootstrap:防止出现空字符串时出现警告框