我可以放心地忽略CodeAnalysis警告:替换字符串==“”与string.IsNullOrEmpty?
-
12-09-2019 - |
题
我有类似下面的代码:
string s = CreateString();
if (s == "") foo(s);
如果s等于 “”,FOO应该被调用。如果字符串为空,这是不可能发生的,那么一个NullReferenceException是罚款(因为这毕竟,一个例外情况)。
CodeAnalysis告诉我测试对于s.IsNullOrEmpty。这将改变的功能在一个nunintended方式。
性能是不是一个问题。
它是安全的抑制相关的CA1820警告?
修改:的更新后的代码采样和文本,以更好地反映我的情况
修改这是在(略微改变的)实际的代码(这是在一个标准的IXmlSerializable的实施):
public void ReadXml (XmlReader reader)
// ...
string img = reader.ReadElementString ("Image");
if (img != "") {
Image = Image.FromFile(img);
}
// ...
解决方案
这将表现不同与问候空值,所以这取决于你想发生什么;你提到NullReferenceException
将是美好的,但并没有什么在代码中列举了将提高这一点,因此为什么它可能会导致意外的错误下游。
我从来没有的的的,但我总是忍不住补充:
static bool IsNullOrEmpty(this string value) {
return string.IsNullOrEmpty(value);
}
,所以我可以使用:
if (s.IsNullOrEmpty()) foo();
其他提示
规格:
如果s等于 “”,FOO应该被调用。 如果字符串为空,这应该永远 发生,那么一个NullReferenceException 是细
只需测试的串长度强>如在劝所述CodeAnalysis规则:
if (s.Length == 0) foo(s);
您的问题:强>
它是安全的抑制相关 CA1820警告?
您可以忽略它,你的代码将工作,但我不会建议:建议,请遵循的准则你一样可以。即使主题(表现)是不是一个问题,您的代码将更加一致,你习惯了写标准代号。
每个代码分析警告有关联,您可以通过highligting警告并按下 F1 访问文档。该项目也可以右键单击以获得帮助。
在任何情况下,这里的文档,解释该特定警告一>
根据该文件,它是“安全的抑制此规则发出的警告,如果性能是不是一个问题。”
这将是更好编写测试为:
if(s != null && s == "")
可以然后处理在另一个空值if语句
你不是真的无视警告,你已经看过了代码,并决定警告不适。这是在其下抑制警告完全合理的条件。
<强>纯投机强>
我希望我能知道多一点关于你想干什么,但是。我怀疑有可能是一个更好的方法来处理它。图案提醒返回出错消息或空信号的方法的成功的我。如果是这样的话,我会考虑要么返回void,失败时抛出异常或返回布尔只有抛出异常时,该消息是至关重要的,返回true /否则为false。
如果null是好的,你会没事的两种方式。
是
但是,我将与CodeAnalysis同意string.IsnullOrEmpty是一个安全的选择。
不处理异常,而你可以是gennerally一个坏主意,所以CA是正确的,你要么需要把null作为空或处理异常。由于使用带有返回值的空引用异常是一个非常糟糕的事情。至少,放入Debug.Assert的(S!= NULL),并比较的String.Empty