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()
方法是您自己的自定义扩展方法。 “真正的”IsNullOrEmpty
是string
的静态方法。
简短回答:如果您将其更改为
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 警告中访问 foreach 变量?