3

我有类似这样的代码:

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);
    }
    // ...
4

8 回答 8

4

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

我从来没有,但我总是很想补充:

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

所以我可以使用:

if (s.IsNullOrEmpty()) foo();
于 2009-11-02T12:34:00.143 回答
3

眼镜 :

如果 s 等于 "",则应该调用 foo。如果 string 为 null,这永远不会发生,那么 NullReferenceException 就可以了。

只需按照 CodeAnalysis 规则中的建议测试字符串长度

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

你的问题 :

抑制相关的 CA1820 警告是否安全?

你可以忽略它,你的代码可以工作,但我不建议这样做,尽可能地遵循指导方针。即使主题(性能)不是问题,您的代码也会更加一致,并且您会习惯编写标准代码。

于 2009-11-02T13:23:48.977 回答
2

每个代码分析警告都有相关的文档,您可以通过突出显示警告并按F1来访问这些文档。您也可以右键单击该项目以获取帮助。

无论如何,这里是解释该特定警告的文档

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

于 2009-11-02T12:34:20.673 回答
1

最好将测试编写为:

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

然后,您可以在另一个 if 语句中处理空值

于 2009-11-02T12:33:29.037 回答
1

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

纯粹的猜测

但是,我希望我对您尝试做的事情有更多的了解。我怀疑可能有更好的方法来处理它。该模式提醒我返回错误消息或为空表示方法成功。如果是这种情况,我会考虑返回 void 并在失败时抛出异常,或者返回 bool 并且仅在消息很关键时抛出异常,否则返回 true/false。

于 2009-11-02T12:43:23.853 回答
0

如果 null 没问题,那么无论哪种方式都可以。

于 2009-11-02T12:31:33.900 回答
0

是的。

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

于 2009-11-02T12:32:23.500 回答
0

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

于 2009-11-02T12:40:19.337 回答