【问题标题】:Resharper warns about a null string (System.NullReferenceException)Resharper 警告空字符串 (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 是对的。唯一缺少的两件是:

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

【问题讨论】:

标签: c# string nullreferenceexception resharper-8.0


【解决方案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 不适用于小写字符串。我的错,对不起!
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多