【问题标题】:If (Array.Length == 0)如果 (Array.Length == 0)
【发布时间】:2010-07-09 14:06:53
【问题描述】:

如果一个数组是空的,看起来你不能使用“.length”检查它的长度。检查数组是否为空的最佳方法是什么?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    您绝对可以检查 empty 数组的长度。但是,如果您尝试在空引用上执行此操作,则会出现异常。我怀疑这就是你遇到的。不过,您可以同时应对这两种情况:

    if (array == null || array.Length == 0)
    

    如果这不是原因,请提供一个简短但完整的程序来演示该问题。如果这 的原因,那么值得花一点时间来确保您了解空引用与“空”集合/字符串/任何东西。

    【讨论】:

    • 关于上面的代码需要注意的重要一点是,在 csharp 中,or 运算符 (||) 是短路的。它看到数组为空(语句为真)并且不尝试评估第二个语句。如果是这样,您仍然会得到 NullReferenceException 并且必须嵌套您的 if 语句。并非所有语言都是这样,VB.Net 就是一个例子。默认的Or 运算符不是短路的;他们为此提供了OrElsesupport.microsoft.com/kb/817250
    • Jon Skeet 发言了!
    • @amit:不,你想使用 ??还有:array?.Length ?? 0 == 0
    • @amitjha:这不等于我的问题中的条件。如果array 为空,那么您的if 条件将不会满足,因为null 不等于0,而我的会。
    • @amitjha:嗯,我不知道你的单元测试是什么样的,但它们相同。 (实际上,由于优先级,您需要括号围绕array?.Length ?? 0,但是...)见dotnetfiddle.net/uRM74Y
    【解决方案2】:

    是的,为了安全起见,我可能会这样做:

    if(array == null || array.Length == 0)
    

    【讨论】:

      【解决方案3】:

      你可以使用

      if (array == null || array.Length == 0)
      

      if (!(array != null && array.Length != 0))
      

      注意!!!!!! 确保 c# 正确实现短路;在进行对象的子项比较之前,您必须将该对象与 NULL 进行比较。

      C# 7.0 及更高版本

      if(!(array?.Length != 0))
      

      【讨论】:

      • 表达式必须更改为 if( ! (array?.Length > 0 ) ) 因为没有括号,not 运算符会尝试对 int 类型的表达式 array?.length 求值并抱怨.使用 not 运算符时,检查的长度应大于 0。
      • if( !(array?.Length > 0 ) ) 效果更好,谢谢
      【解决方案4】:

      如果长度为空且数组存在,则可以使用.Length == 0,但确定不为空?

      【讨论】:

        【解决方案5】:

        正如其他人已经建议的那样,您很可能会得到NullReferenceException,这可以通过首先检查参考是否为null 来避免。但是,您需要问自己是否真的有必要进行检查。您是否会这样做,因为引用实际上可能是 null 并且它是 null 在您的代码中具有特殊含义?还是您会这样做以掩盖错误?这个问题的性质使我相信它会是后者。在这种情况下,您确实需要深入检查代码并找出为什么该引用没有被正确初始化。

        【讨论】:

          【解决方案6】:

          由于 .Net >= 5.0,最好的方法是使用Any

          if(!array.Any()) {
             //now you sure it's empty
          }
          

          对于可空数组:

          if(!(array?.Any() == true)) {
             //now you sure it's null or empty
          }
          

          【讨论】:

            【解决方案7】:

            这是最好的方法。请注意 Array 是 NET 中的对象,因此您需要先检查 null。

            【讨论】:

              【解决方案8】:

              如果arraynull,尝试取消引用array.Length 将抛出NullReferenceException。如果您的代码认为nullarray 的无效值,您应该拒绝它并责怪调用者。一种这样的模式是抛出ArgumentNullException

              void MyMethod(string[] array)
              {
                  if (array == null) throw new ArgumentNullException(nameof(array));
              
                  if (array.Length > 0)
                  {
                      // Do something with array…
                  }
              }
              

              如果您想接受 null 数组作为不做某事的指示或作为可选参数,如果它为空,您可能根本无法访问它:

              void MyMethod(string[] array)
              {
                  if (array != null)
                  {
                      // Do something with array here…
                  }
              }
              

              如果您想避免在arraynull 或长度为零时触摸它,那么您可以使用C#-6’s null coalescing operator 同时检查两者。

              void MyMethod(string[] array)
              {
                  if (array?.Length > 0)
                  {
                      // Do something with array…
                  }
              }
              

              多余的长度检查

              您将空数组视为特殊情况似乎很奇怪。在许多情况下,例如,如果您无论如何都只是循环遍历数组,则无需将空数组视为特殊情况。当array.Length0 时,foreach (var elem in array) {«body»} 将永远不会执行«body»。如果您特别对待 array == null || array.Length == 0 以例如提高性能,您可以考虑为后代留下评论。否则,检查Length == 0 显得多余。

              多余的代码使理解程序变得更加困难,因为阅读代码的人可能会认为每一行代码对于解决某些问题或实现正确性都是必要的。如果您包含不必要的代码,那么读者将在删除之前花费永远试图弄清楚为什么该行是必要的;-)。

              【讨论】:

                【解决方案9】:

                Jon Skeet 回答正确。请记住,“IF”中的测试顺序很重要。 检查长度前的null。我也更喜欢将null 放在等号的左侧,这是我从 Java 获得的一个习惯,它使代码更加高效和快速……我认为它在今天的很多应用程序中并不重要,但它是一个好习惯!

                if (null == array || array.Length == 0)
                

                【讨论】:

                  【解决方案10】:

                  您建议的测试很好,只要数组已初始化...

                  马丁。

                  【讨论】:

                    【解决方案11】:

                    首先检查数组是否为空,以避免空指针异常

                    任何语言的逻辑:如果数组为空或为空:do ....

                    【讨论】:

                      【解决方案12】:

                      你的意思是空还是空,两种不同的东西,

                      如果数组已实例化但为空,则长度正确,如果尚未实例化,则 test vs null

                      【讨论】:

                        【解决方案13】:

                        //还有另一种方法来检查数组是否包含项目

                        if ( array.Count == 0) return;

                        【讨论】:

                        • 欢迎来到 Stack Overflow,感谢您的第一个回答!不幸的是,我相信您的答案与原始问题存在相同的问题,即如果数组为空,则会导致空引用异常
                        猜你喜欢
                        • 1970-01-01
                        • 2017-07-08
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-01-07
                        • 2011-06-15
                        • 2023-02-11
                        • 1970-01-01
                        相关资源
                        最近更新 更多