我可以安全地忽略CodeAnalysis警告:用string.IsNullOrEmpty替换string ==“”吗?

时间:2009-11-02 12:29:14

标签: c# code-analysis isnullorempty

我有类似的代码:

string s = CreateString();
if (s == "") foo(s);

如果s等于“”,则应调用foo。如果string为null,这应该永远不会发生,那么NullReferenceException就好了(因为这毕竟是一种例外情况)。

CodeAnalysis告诉我测试s.IsNullOrEmpty。这会以一种无意义的方式改变功能。

表现不是问题。

禁止关联的CA1820警告是否安全?

编辑:更新了代码示例和文字,以更好地反映我的情况。

编辑:这是(略有改动的)实际代码(它在标准的IXmlSerializable实现中):

public void ReadXml (XmlReader reader)
    // ...
    string img = reader.ReadElementString ("Image");
    if (img != "") {
        Image = Image.FromFile(img);
    }
    // ...

8 个答案:

答案 0 :(得分:4)

对于null,它的行为会有所不同,所以它取决于你想要发生的事情;你提到NullReferenceException会没问题,但引用的代码中没有任何内容会引起这种情况,因此可能会导致下游出现意外错误。

我从不拥有,但我总是想添加:

static bool IsNullOrEmpty(this string value) {
    return string.IsNullOrEmpty(value);
}

所以我可以使用:

if (s.IsNullOrEmpty()) foo();

答案 1 :(得分:3)

规格:

  

如果s等于“”,则应调用foo。   如果string为null,则永远不应该   发生,然后是NullReferenceException   很好。

只需test the string length as adviced in the CodeAnalysis rule

if (s.Length == 0) foo(s);

您的问题:

  

抑制关联是否安全   CA1820警告?

你可以忽略它,你的代码会起作用,但我不建议,尽可能遵循指南。即使主题(性能)不是问题,您的代码也会更加一致,并且您习惯于编写标准代码。

答案 2 :(得分:2)

每个“代码分析”警告都有相关文档,您可以通过高亮显示警告并按 F1 来访问该文档。您也可以右键单击该项目以获得帮助。

无论如何,这是documentation that explains that particular warning

根据该文档,如果性能不是问题,“可以安全地禁止此规则发出警告”。

答案 3 :(得分:1)

最好将测试编写为:

if(s != null && s == "")

然后,您可以在另一个if语句

中处理空值

答案 4 :(得分:1)

您并没有真正忽略该警告,您已查看代码并确定该警告不适用。这是一个完全合理的条件,可以抑制警告。

Pure Speculation

但我希望我能更多地了解你想要做的事情。我怀疑可能有更好的方法来处理它。该模式提醒我返回错误消息或空以表示方法成功。如果是这种情况,我会考虑返回void并在失败时抛出异常或返回bool,只在消息严重时抛出异常,否则返回true / false。

答案 5 :(得分:0)

如果null为OK,那么无论如何都可以。

答案 6 :(得分:0)

但我同意CodeAnalysis with string.IsnullOrEmpty是一个安全的选择。

答案 7 :(得分:0)

不处理异常,而你可以通常是一个坏主意,所以CA是正确的,因为你需要将null视为空或处理异常。使用返回值导致的空引用异常是一件非常糟糕的事情。至少放入Debug.Assert(s!= null)并与string.Empty

进行比较