我有类似的代码:
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);
}
// ...
答案 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
进行比较