2009-11-02 62 views
3

我有类似的代码如下:我可以安全地忽略CodeAnalysis警告:将string ==“”替换为string.IsNullOrEmpty?

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

如果s等于“”,富应该叫。如果字符串为空,而这绝不会发生,那么NullReferenceException就没有问题了(毕竟,这是一种特殊情况)。

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

性能不是问题。

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

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

编辑:这是(轻微改变)实际的代码(这是在标准实施IXmlSerializable的):

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

回答

4

它将不同的表现与问候空处理空值,所以这取决于你想要发生;你提到NullReferenceException是可以的,但是在引用的代码中没有任何内容会引发这个问题,因此它可能会导致下游出现意想不到的错误。

我从来,但我总是忍不住补充:

​​

,所以我可以使用:

,您可以通过访问
if (s.IsNullOrEmpty()) foo(); 
+0

你在方括号内缺少一个“this”,使得该方法成为扩展;) 无论如何,我已经使用了很长一段时间...它只是读得好多了。 – em70 2009-11-02 12:36:42

+0

我已经在“哎呀,我是个木偶”中加入了缺少的“this”编辑; -p – 2009-11-02 12:38:07

+0

你是英国人和你的格言。让我想搬到英国。 – tvanfosson 2009-11-02 12:47:27

0

如果空就OK了,你会没事的两种方式。

0

是的。

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

1

这将是更好地编写测试为:

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

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

+0

为null添加额外的测试实际上是有意义的,并删除了警告。一个简单但不错的主意。 – mafu 2009-11-02 12:49:59

2

每个代码分析警告有相关文档高调报警并按F1。您也可以右键单击该项目以获得帮助。

在任何情况下,这里的documentation that explains that particular warning

根据这一文件,它是“安全的抑制此规则发出的警告,如果性能是不是一个问题。”

0

不处理异常,而你可以是gennerally一个坏主意,所以CA是正确的,你要么需要把null作为空或处理异常。由于使用返​​回值而导致的空引用异常是非常糟糕的事情。至少要放入一个Debug.Assert(s!= null)并与字符串进行比较。空

+0

我对这个问题的理解是该方法永远不会返回null。在这种情况下,它确实是一个特殊的条件,可以抛出异常。是的,这是一件坏事,但根据他的代码,它永远不会发生。 – tvanfosson 2009-11-02 12:45:41

1

你并没有真正忽视警告,你已经看过代码并决定警告不适用。这是抑制警告的完全合理的条件。

纯属猜测

我希望我能知道多一点关于你想干什么,但是。我怀疑可能有更好的方法来处理它。该模式让我想起了返回一个错误信息或空白来表示方法成功的信号。如果是这样的话,我会考虑返回void并在失败时抛出异常或返回bool,并且只在消息严重时抛出异常,否则返回true/false。

+0

我会发布实际的代码。 – mafu 2009-11-02 12:51:09

3

规格:

如果s等于 “”,富应该叫。 如果字符串为空,它永远不会发生 ,那么NullReferenceException 就没有问题。

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

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

你的问题:

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

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

相关问题