C# string.IsNullOrEmpty()与string.NotNullOrEmpty()的比较

C# string.IsNullOrEmpty()与string.NotNullOrEmpty()的比较,c#,.net,string,C#,.net,String,我很好奇是否有开发人员在使用string.IsNullOrEmpty()时经常使用负数而不是正数 e、 g 我99%的时间都是这样使用这个方法的。设计决定是什么?这是我见过的最常见的用法 C#命名约定规定您的表达式应为正数,例如“Is…”而不是“IsNot…” 编辑:通常,我在方法开头执行错误检查和输入验证时使用它,如果参数为null或空,则引发异常 if(string.IsNullOrEmpty(myParameter)) { 抛出新… } 在命名东西时通常不鼓励双重否定!string.No

我很好奇是否有开发人员在使用string.IsNullOrEmpty()时经常使用负数而不是正数

e、 g


我99%的时间都是这样使用这个方法的。设计决定是什么?

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

C#命名约定规定您的表达式应为正数,例如“Is…”而不是“IsNot…”

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


if(string.IsNullOrEmpty(myParameter))
{
抛出新…
}

在命名东西时通常不鼓励双重否定<代码>!string.NotNullOrEmpty(…)就可以了。

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

  • 它不是空的,也不是空的
  • 它不是空的或者是空的

  • 就我个人而言,我更倾向于首先迎合非否定情景。对我来说,先做正确的部分,然后再做错误的部分是有意义的。归结到个人风格。

    可能是因为这样名称就必须是冗长的
    isnotnull和notempty
    才能具体化。

    我更喜欢扩展方法:

    public static class StringExtensions
    {
        public static bool IsNullOrEmpty(this string value)
        {
            return string.IsNullOrEmpty(value);
        }
    }
    
    我觉得最好说:

    if(myValue.IsNullOrEmpty())
    


    我一直认为这似乎是错误的,因为我使用消极的方式比使用积极的方式要多得多


    我还希望有一个实例IsEmpty()或IsNotEmpty(),以便在函数中声明变量时使用。这不能是IsNullOrEmpty()或IsNotNullOrEmpty(),因为如果实例为null,那么您将得到一个null引用异常。

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

    (无效)∨ 空的)⇔ -无效∧ 空的

    (无效)∨ 空的)≠ -无效∨ 空的

    我想,这里的要点是,它目前的方式是明确的,而将相反的方式明确化将是很麻烦的。

    “NotNullOrEmpty”是模糊的,它可能意味着“(notnull)或空”,也可能意味着“not(null或空)”。为了使它明确,你必须使用“NotNullAndNotEmpty”,这是一个满嘴的单词

    另外,“IsNullOrEmpty”命名鼓励用作保护子句,我认为这很有用。例如:

    if (String.IsNullOrEmpty(someString))
    {
       // error handling
       return;
    }
    // do stuff
    
    我认为这比:

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

    事实上,我倾向于提供一个不同于其他几个人提供的“这是不明确的”解释的答案(尽管我也同意这个答案):

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

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

    为此:

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

    这是一个非常特殊的场景(null/空字符串提示立即退出),显然不是使用
    IsNullOrEmpty
    的方法的构造方式;但我认为它实际上相当普遍。

    我总是为“hascantent()”创建一个扩展方法,它通常是有意义的,遵循“积极”规范,并节省代码膨胀,因为我使用它的频率比它的对应方高得多:

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

    当然,您现在可以使用
    string.IsNullOrWhiteSpace(string)
    ,而不是.NET4.0中的
    string.IsNullOrEmpty(string)
    在我意识到翻转问题所需做的只是将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);
            }
    

    我认为布尔结果的方法应该是“积极的”,因为它们应该使用“是…”而不是“不是…”。。。我只是想知道为什么会这样。@Johannes是的……绝对肯定!为什么微软觉得有必要增加额外的膨胀?呃..怎么会膨胀?如果有什么区别的话,你对单词“bloat”的多余使用“extra”对我来说听起来像是膨胀了……请查看代码中99%的IsNullOrEmpty()调用,并尝试应用“用保护子句替换嵌套的条件语句”重构。实际上,我们的代码库中有一个人将变量命名为“isNotGuam”。在Delphi中,试图破译“如果不是”的意思总是很有趣的,如果(!string.NotNullOrEmpty(..){}否则{//gooooo!}你不必把动词变成否定的,这是一个坏主意example@Dan:你实际上可以+“丹:我想那只是哲学。。。只要方法名中的值.IsNull()、值.ThrowIfNull()或值.IsNullOrEmpty()是明确的,我对在null上工作的扩展方法没有问题.但是你对专门命名为Null的扩展方法怎么看?我相信Bob叔叔可能会不赞成,但我不认为如果我们做foo.IsNull(),天会塌在我们头上-我会说你想做的很明显achieve@Brian我明白你的意思。就我个人而言,我认为对一个未统计的变量调用方法永远不会让我感到舒服,因为我认为它开创了一个不安全的先例。另一方面,我很失望我们不能创建静态扩展方法——我希望能够编写
    AType.IsNullOrEmpty(aVar)更多类型。谢谢。我在想这个最好的名字。我提出了“HasValue”和“IsPopulated”,但HasContent可能比两者都好。为了简洁易读,我还添加了一个IsEmpty()扩展方法。我知道人们可能会抱怨没有使用Null这个词,但我对string类的这个例外感到高兴。
    
    public bool DoSomethingWithString(string s) {
        if (!string.IsNullOrEmpty(s)) {
            // here's the important code, nested
        } else {
            return false;
        }
    }
    
    public static bool HasContent(this string s) {
        return !string.IsNullOrEmpty(s);
    }
    
     // 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);
            }