如果我将数组初始化为0大小会怎样?

sam*_*moz 55 c# arrays

假设我的功能如下:

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

我传了一个空列表.

东西会是空指针吗?或者它是一个指向未初始化的内存中某个随机位置的指针?

Jon*_*eet 90

它将创建一个空数组对象.这仍然是一个完全有效的对象 - 并且在内存中占用非零空间.它仍然会知道它自己的类型和计数 - 它只是没有任何元素.

空数组通常可用作不可变的空集合:您可以无限制地重复使用它们; 数组本质上是可变的,但仅限于它们的元素 ......在这里我们没有要改变的元素!由于数组不可调整大小,因此空数组完全不可变.

请注意,拥有一个空数组而不是空引用通常很有用:返回集合的方法或属性几乎总是返回一个空集合而不是空引用,因为它提供了一致性和一致性 - 而不是让每个调用者检查无效.如果您想避免多次分配,可以使用:

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

    public static readonly T[] Empty { get { return empty; } }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

return Arrays<string>.Empty;
Run Code Online (Sandbox Code Playgroud)

(或者其他什么)当你需要使用对特定类型的空数组的引用时.

  • @NETscape:如果你实现一个返回`int []`的方法并且你没有返回任何元素,你会怎么做? (5认同)
  • @NETscape:返回null对所有呼叫者来说都是一种痛苦.返回一个空数组可以提供更加一致,统一的体验.您始终可以存储对空数组的引用,以避免每次需要返回时都分配它.... (4认同)
  • 由于有关其"空虚"的信息必须存储在某处(即计数),因此必须占用一些空间.鉴于我在回答中写的内容,你当然可以(但这很危险)有内部指导,而不是初始化长度为0的数组,你将引用设置为null.但是,当使用这样的阵列时,这可能需要一些额外的检查,并且不值得节省空间. (2认同)

Jan*_*net 12

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

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

  • 在数据库中,NULL通常表示"此值未知".所以`MIDDLE_NAME IS NULL`表示中间名是未知的,而`MIDDLE_NAME =''表示这个人没有中间名.在C#中,`null`的语义要宽得多(不适用,尚未设置等),但空字符串和数组无论如何都会向我指示 - 该值已被确定为空.(有时在数据库中,NULL意味着"不适用",但这会激怒硬核RDBMS理论家.请谨慎使用.) (5认同)
  • NULL ==""是一个邪恶的Oracle"特征" - 没有理智的系统通常应该将它们视为平等.我的意见...... ^^ (3认同)

Bri*_*sio 5

这是很好的代码.您将获得一个包含零项(分配)的Array对象.