我可以放心地忽略CodeAnalysis警告:替换字符串==“”与string.IsNullOrEmpty?

StackOverflow https://stackoverflow.com/questions/1661024

  •  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

scroll top