代码之家  ›  专栏  ›  技术社区  ›  mafu

我可以安全地忽略CodeAnalysis警告:将string==“”替换为string.IsNullOrEmpty吗?

  •  3
  • mafu  · 技术社区  · 16 年前

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

    如果s等于“”,则应调用foo。如果字符串为null,这不应该发生,那么NullReferenceException是可以的(毕竟这是一种特殊情况)。

    CodeAnalysis告诉我测试s.IsNullOrEmpty。这将以一种意想不到的方式改变功能。

    编辑: 更新了代码示例和文本,以更好地反映我的情况。

    编辑:

    public void ReadXml (XmlReader reader)
        // ...
        string img = reader.ReadElementString ("Image");
        if (img != "") {
            Image = Image.FromFile(img);
        }
        // ...
    
    8 回复  |  直到 16 年前
        1
  •  4
  •   Marc Gravell    16 年前

    对于null,它的行为会有所不同,所以这取决于你想发生什么;你提到了 NullReferenceException

    我从未 ,但我总是想补充:

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

    所以我可以使用:

    if (s.IsNullOrEmpty()) foo();
    
        2
  •  3
  •   Guillaume    16 年前

    规格:

    如果s等于“”,则应调用foo。 很好。

    test the string length as adviced in the CodeAnalysis rule :

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

    您的问题:

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

    尽你所能。即使主题(性能)不是问题,你的代码也会更加一致,你会习惯于编写标准代码。

        3
  •  2
  •   Mark Seemann    16 年前

    每个代码分析警告都有相关文档,您可以通过突出显示警告并按来访问这些文档 一层楼

    无论如何,这是 documentation that explains that particular warning .

    根据该文档,“如果性能不是问题,则可以安全地抑制此规则的警告”。

        4
  •  1
  •   Michael Edwards    16 年前

    最好将测试写成:

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

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

        5
  •  1
  •   tvanfosson    16 年前

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

    然而,我希望我能更多地了解你想做什么。我怀疑可能有更好的方法来处理它。这个模式让我想起返回错误消息或空来表示方法成功。如果是这样的话,我会考虑返回void并在失败时抛出异常,或者返回bool,仅在消息严重时抛出异常并在其他情况下返回true/false。

        6
  •  0
  •   tsilb    16 年前

        7
  •  0
  •   EKS    16 年前

    对。

    但我同意使用string.IsnullOrEmpty进行CodeAnalysis是一个安全的选择。

        8
  •  0
  •   Rune FS    16 年前

    在Can中不处理异常通常是一个坏主意,因此CA是正确的,因为您需要将null视为空或处理异常。使用返回值导致的空引用异常是一件非常糟糕的事情。至少放一个调试。断言(s!=null)并与字符串进行比较。空