【问题标题】:string.IsNullOrEmpty() vs string.NotNullOrEmpty()string.IsNullOrEmpty() 与 string.NotNullOrEmpty()
【发布时间】:2020-11-14 20:53:33
【问题描述】:

我很好奇是否有开发人员更频繁地使用 string.IsNullOrEmpty() 来表示负数而不是正数

例如

if (!string.IsNullOrEmpty())

这就是我 99% 的时间使用该方法的方式。对此的设计决策是什么?

【问题讨论】:

  • 我认为具有布尔结果的方法应该是“积极的”,因为他们应该使用“Is...”而不是“Not...”......只是一个想法为什么会这样.
  • @Johannes 是的......绝对是肯定的!
  • 为什么 MS 发现有必要添加额外的膨胀?呃..
  • 怎么膨胀?如果有的话,您对“膨胀”一词的多余使用“额外”对我来说听起来像膨胀......
  • 查看代码中 99% 的 IsNullOrEmpty() 调用,并尝试应用“用保护子句替换嵌套条件”重构。

标签: c# .net string


【解决方案1】:

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

  1. 不为空也不为空
  2. 不为空或为空

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我们的代码库中实际上有一个人将变量命名为“isNotGuam”。尝试破译(在 Delphi 中)的含义总是很有趣,如果不是 isNotGuam 那么
    • if (!string.NotNullOrEmpty(..)) { } else { //goooooo! }
    • 你不必使动词否定,这是一个不好的例子
    【解决方案3】:

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

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

    ¬(null ∨ 空) ≠ ¬null ∨ 空

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 谢谢。我只是在想这个最好的名字。我想出了“HasValue”和“IsPopulated”,但 HasContent 可能比两者都好。
        • 为了简洁易读,我还添加了一个 IsEmpty() 扩展方法。我知道人们可能会抱怨没有使用 Null 这个词,但我对字符串类的这个例外感到满意。
        【解决方案6】:

        我更喜欢扩展方法:

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

        我觉得这样说更好:

        if(myValue.IsNullOrEmpty())
        

        if(!myValue.IsNullOrEmpty())
        

        【讨论】:

        • @Dan:你实际上可以,stackoverflow.com/questions/647643/…。 +1。
        • @Dan:我想这只是哲学......我对适用于 null 的扩展方法没有任何问题,只要在方法名称中明确:value.IsNull(), value。 ThrowIfNull() 或 value.IsNullOrEmpty()。
        • 但是您如何看待专门命名为 Null 的扩展方法?
        • 我确信 Bob 叔叔可能会不赞成,但我认为如果我们执行 foo.IsNull(),天不会掉到我们头上 - 我会说很明显你正在努力实现
        • @Brian:我明白你的意思。就我个人而言,我认为我永远不会对在未指定的变量上调用方法感到满意,因为我认为它开创了一个不安全的先例。另一方面,我对我们无法创建静态扩展方法感到非常失望 - 我希望能够在更多类型上写 AType.IsNullOrEmpty(aVar);
        【解决方案7】:

        也许是因为那样的话,名称必须是冗长的 IsNotNullAndNotEmpty 才能具体。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              “NotNullOrEmpty”有歧义,它可能表示“(非空)或空”,也可能表示“非(空或空)”。为了清楚起见,您必须使用“NotNullAndNotEmpty”,这是满口的。

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

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

              我认为通常比:

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

              【讨论】:

                【解决方案11】:

                我实际上倾向于提供与其他几个人提供的“它是模棱两可”的解释不同的答案(尽管我也同意这个答案):

                就我个人而言,我喜欢尽量减少代码中的嵌套,因为(对我而言)花括号代码越多,就越难遵循。

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

                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】:

                  我个人更喜欢先迎合非否定的情况。对我来说,先做真实的部分然后做虚假的部分才有意义。归结为个人风格。

                  【讨论】:

                    【解决方案13】:

                    我一直认为这似乎是错误的方式,因为我使用否定的次数多于使用肯定的次数。

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

                    【讨论】:

                      【解决方案14】:

                      我有同样的问题,然后我才意识到我必须做的就是将 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);
                              }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-01-25
                        • 1970-01-01
                        • 2020-11-03
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-11-11
                        相关资源
                        最近更新 更多