代码之家  ›  专栏  ›  技术社区  ›  Chris S

string.isNullOrEmpty()与string.notNullOrEmpty()的比较

  •  28
  • Chris S  · 技术社区  · 16 年前

    我很好奇是否有开发人员使用string.isNullOrEmpty()时,使用负数的频率比使用正数的频率高

    例如

    if (!string.IsNullOrEmpty())
    

    这就是我在99%的时间里如何使用这个方法。这个的设计决定是什么?

    13 回复  |  直到 10 年前
        1
  •  58
  •   Tim Cooper    13 年前

    因为“没有空”比“没有空”更容易理解。后者可以解释为:

    1. 它不是空的,也不是空的
    2. 不是空的或者是空的
        2
  •  36
  •   Mehrdad Afshari    16 年前

    双重否定通常在命名事物时是不鼓励的。 !string.NotNullOrEmpty(...) 会创造一个。

        3
  •  11
  •   tvanfosson    16 年前

    对于那些逻辑学家来说,!String.IsNullOrEmpty不等于String.IsNotNullOrEmpty。@盖法说得对。使用demorgan定律,它必须是string.isNotNullAndNotEmpty才能等效。

    ,(空空),空

    —(空空)≠空空

    我想,这里的重点是,它目前的方式是明确的,在那里,使相反的明确将是繁琐的。

        4
  •  6
  •   Erich Mirabal    16 年前

    C命名约定要求表达式应为正数,如“is…”而不是“is not…”。

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

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

        5
  •  6
  •   Brian Genisio    16 年前

    作为旁注,我更喜欢扩展方法:

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

    我觉得说:

    if(myValue.IsNullOrEmpty())
    

    if(!myValue.IsNullOrEmpty())
    
        6
  •  5
  •   sethjeffery    15 年前

    我总是为“hasContent()”创建一个扩展方法,它通常是有意义的,遵循“积极的”规范,并在代码膨胀时保存下来,因为我使用它的频率比它的对应方要高:

    public static bool HasContent(this string s) {
        return !string.IsNullOrEmpty(s);
    }
    
        7
  •  4
  •   Guffa    16 年前

    也许是因为那时的名字会很长 IsNotNullAndNotEmpty 具体来说。

        8
  •  2
  •   Binoj Antony    15 年前

    当然你可以一直使用 string.IsNullOrWhiteSpace(string) 现在而不是 string .IsNullOrEmpty(string) 来自.NET 4

        9
  •  1
  •   John Kraft    16 年前

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

        10
  •  1
  •   Wedge    16 年前

    “notNullOrEmpty”不明确,可能表示“(非空)或空”,也可能表示“非(空或空)”。为了使它不含糊,你必须使用“NotNullandNotEmpty”,这是一个满口的东西。

    另外,“isNullorEmpty”命名鼓励使用作为一个保护子句,我认为这是有用的。例如。:

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

    我认为这比:

    if (!String.IsNullOrEmpty(someString))
    {
       // do stuff
    }
    else
    {
       // error handling
       return;
    }
    
        11
  •  1
  •   Dan Tao    15 年前

    实际上,我倾向于给出不同于其他几个人所给出的“这是含糊不清的”解释的答案(尽管我也同意这个答案):

    就个人而言,我喜欢最小化代码中的嵌套,因为(对我来说)大括号代码越多,就越难执行。

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

    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;
        }
    }
    

    这是一个非常具体的场景(空字符串提示立即退出),显然不是方法使用的方式 IsNullOrEmpty 总是有条理的,但我认为这实际上很常见。

        12
  •  0
  •   uriDium    16 年前

    就我个人而言,我更喜欢先满足非否定的情况。对我来说,先做正确的部分,然后再做错误的部分是有意义的。归结到个人风格。

        13
  •  0
  •   stevehipwell    16 年前

    我一直认为这似乎是错误的方向,因为我经常用否定的词而不是肯定的词。

    我还希望有一个实例isEmpty()或isNotEmpty(),在函数中声明变量时使用。这不能是isNullOrEmpty()或isNotNullOrEmpty(),就像实例为空一样,那么您将得到一个空引用异常。