string.IsNullOrEmpty()vs string.NotNullOrEmpty()

时间:2009-04-09 13:58:04

标签: c# .net string

我很好奇是否有任何开发人员使用string.IsNullOrEmpty()更多地使用负数而不是正数

e.g。

if (!string.IsNullOrEmpty())

这是我99%的时间使用该方法的方法。对此有何设计决定?

14 个答案:

答案 0 :(得分:58)

因为“IsNullOrEmpty”比“NotNullOrEmpty”更容易理解。后者可以解释为:

  1. 它不是空的而且它不是空的
  2. 它不为空或为空

答案 1 :(得分:36)

在命名内容时通常不鼓励双重否定。 !string.NotNullOrEmpty(...)会成为一个。

答案 2 :(得分:12)

对于那些逻辑学家,!string.IsNullOrEmpty不等同于string.IsNotNullOrEmpty。 @Guffa说得对。使用DeMorgan定律,它必须是string.IsNotNullAndNotEmpty才能等效。

¬(null∨empty)⇔¬null∧¬empty

¬(null∨空)≠空∨空

我想,这里的观点是,它目前的方式是明确的,因为相反的明确是明显的。

答案 3 :(得分:6)

C#命名约定规定你的表达式应该是正面的,例如“Is ...”而不是“IsNot ......”

编辑:通常,我在方法开头进行错误检查和输入验证时使用它,如果参数为null或为空,则引发异常。

if (string.IsNullOrEmpty(myParameter))
{
throw new ....
}

答案 4 :(得分:6)

正如旁注,我更喜欢扩展方法:

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

我觉得最好说:

if(myValue.IsNullOrEmpty())

if(!myValue.IsNullOrEmpty())

答案 5 :(得分:5)

我总是为“HasContent()”创建一个扩展方法,它通常是有意义的,遵循“正面”规范,并节省代码膨胀,因为我使用它比对应的更频繁:

public static bool HasContent(this string s) {
    return !string.IsNullOrEmpty(s);
}

答案 6 :(得分:4)

也许因为那时名称必须是冗长的IsNotNullAndNotEmpty才具体。

答案 7 :(得分:2)

当然,您现在可以始终使用string.IsNullOrWhiteSpace(string)而不是.NET 4.0中的string .IsNullOrEmpty(string)

答案 8 :(得分:1)

这是我见过的最常见的用法。

答案 9 :(得分:1)

“NotNullOrEmpty”是不明确的,它可能意味着“(不为空)或空”或者它可能意味着“不(空或空)”。为了使它明确无误,你必须使用“NotNullAndNotEmpty”,这是一个满口的。

此外,“IsNullOrEmpty”命名鼓励使用作为保护条款,我认为这是有用的。 E.g:

if (String.IsNullOrEmpty(someString))
{
   // error handling
   return;
}
// do stuff
我认为通常比以下更清洁:

if (!String.IsNullOrEmpty(someString))
{
   // do stuff
}
else
{
   // error handling
   return;
}

答案 10 :(得分:1)

我实际上倾向于从其他几个人提供的“它含糊不清”的解释中给出不同的答案(尽管我同意这个答案):

就个人而言,我喜欢在我的代码中最小化嵌套,因为(对我而言)代码花括号越多,就越难以遵循。

因此我更喜欢这个(例如):

public bool DoSomethingWithString(string s) {
    if (string.IsNullOrEmpty(s))
        return false;

    // here's the important code, not nested
}

到此:

public bool DoSomethingWithString(string s) {
    if (!string.IsNullOrEmpty(s)) {
        // here's the important code, nested
    } else {
        return false;
    }
}

这是一个非常具体的场景(其中null / empty字符串提示立即退出)并且显然不是使用IsNullOrEmpty的方法总是被构造的方式;但我认为这实际上非常普遍。

答案 11 :(得分:0)

就我个人而言,我更愿意首先迎合非否定的情景。对我来说,先做真正的部分,然后做假的,这才有意义。归结为个人风格。

答案 12 :(得分:0)

我一直认为这似乎是错误的方式,因为我使用负面的次数远远超过正面。

我还想在函数中声明变量时使用实例IsEmpty()或IsNotEmpty()。这可能不是IsNullOrEmpty()或IsNotNullOrEmpty(),就好像实例为null然后你会得到一个空引用异常。

答案 13 :(得分:0)

我有一个相同的问题,然后才意识到我要翻转这个问题所要做的就是将Not运算符放在条件前面。我认为这可以清除我的代码。

 // need to check if tBx_PTNum.Text is empty
        /*
        if (string.IsNullOrWhiteSpace(tBx_PTNum.Text))
        {
            // no pt number yet
        }
        else
        {
            ptNum = Convert.ToInt32(tBx_PTNum.Text);
        }
        */
        
        if(!string.IsNullOrEmpty(tBx_PTNum.Text))
        {
            ptNum = Convert.ToInt32(tBx_PTNum.Text);
        }