代码之家  ›  专栏  ›  技术社区  ›  foobarfuzzbizz

如果将数组初始化为大小为0,会发生什么情况?

  •  50
  • foobarfuzzbizz  · 技术社区  · 14 年前

    void myFunc(List<AClass> theList)
    {
       string[] stuff = new string[theList.Count];
    }
    

    我递上一张空名单。

    7 回复  |  直到 14 年前
        1
  •  105
  •   Jon Skeet    5 年前

    空数组通常可用作不可变的空集合:您可以无限地重用它们;数组本身是可变的,但仅限于它们的 元素

    请注意,使用空数组而不是空引用通常很有用:返回集合的方法或属性几乎应该是空的 总是 返回空集合而不是空引用,因为它提供了一致性和一致性,而不是 调用方检查空值。如果要避免多次分配,可以使用:

    public static class Arrays<T>
    {
        private static readonly T[] empty = new T[0];
    
        public static readonly T[] Empty { get { return empty; } }
    }
    

    然后你可以使用:

    return Arrays<string>.Empty;
    

        2
  •  12
  •   Janick Bernet    9 年前

    为什么要这么做?它只会指向一个大小为0的数组,这是完全有效的。

    我认为这里的混淆源于用大小为0的数组或设置为null的变量来表示缺少数据的模糊性(空字符串或字符串引用设置为null的字符串也存在同样的模糊性)。两者都是表明这种缺席的有效方法,而且只有一种可能更有意义。因此,在某些数据库(特别是Oracle)上,空字符串等于NULL值,反之亦然,而一些编程语言(我认为,新版本的C#就是其中之一)允许指定引用永远不为NULL,也消除了上述歧义。

        3
  •  5
  •   Brian Genisio    14 年前

        4
  •  3
  •   dahlbyk    14 年前

    stuff 将是对长度为的数组的引用 theList.Count default(string) ,即 null

        5
  •  2
  •   heijp06    14 年前

    以下是C语言规范:

    • 尺寸长度的计算值验证为 跟随。如果一个或多个值 小于零,a 抛出System.OverflowException并
    • 将分配具有给定维度长度的数组实例。如果 内存不足 不执行进一步的步骤。

    所以对于长度为零的情况,内存被分配。

        6
  •  1
  •   Afroshar    6 年前

    林克 .Concat

    public string[] ConcatUsers(string[] users1, string[] users2)
    {
        return (users1 ?? new string[0]).Concat(users2 ?? new string[0]).ToArray();
    }
    

    (这只是一个0大小数组初始值设定项可能有用的示例)

        7
  •  0
  •   JAB    14 年前

    如果 theList 是一个实际的 List 对象,并且只是空的,那么 theList.Count 将返回0。这意味着声明变为

    string[] stuff = new string[0];
    

    stuff 将只是一个长度为0的数组(字符串)。

        8
  •  0
  •   badpanda    14 年前

    只要您确保您的列表<&燃气轮机;实际上传递给方法的是在某个地方初始化的,比如

    List<Stuff> myStuff = new List<Stuff>;
    

    列表不会指向null。这将是一个零的东西清单。