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

时间:2010-06-23 14:08:25

标签: c# arrays

假设我的功能如下:

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

我传了一个空列表。

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

8 个答案:

答案 0 :(得分:85)

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

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

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

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;
当需要使用对特定类型的空数组的引用时,

(或其他)。

答案 1 :(得分:11)

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

stuff将引用长度为theList.Count且所有条目初始化为default(string)的数组null

答案 4 :(得分:2)

以下是C#语言规范:

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

因此,如果长度为零,则分配内存。

答案 5 :(得分:1)

Linq Category1 <- c('A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B') Category2 <- c('W','V','W','V','W','V','W','V','W','V','W','V','W','V','W','V','W','V','W','V') Class <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4) df <- data.frame(Category1, Category2, Class) g <- ggplot(df, aes(Category1, Category2)) g <- g + facet_wrap(Class ~ ., nrow = 3) + geom_count(col="tomato3", show.legend=F) + scale_size_continuous(range = c(5, 10)) labs(subtitle="Count Plot", y="Category2", x="Category1", title="Cat1 vs Cat2") g g2 <- g + geom_text(data=ggplot_build(g)$data[[1]], aes(x, y, label=n), size=2) #+ scale_size(range = c(5, 15)) g2 将在任何参数为null时引发异常(在我的情况下可能会发生)。因此,我必须在代码中执行以下操作:

.Concat

(这是一个0大小的数组初始化程序可能有用的示例)

答案 6 :(得分:0)

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

string[] stuff = new string[0];

换句话说,stuff只是一个长度为0的数组(字符串)。

答案 7 :(得分:0)

只要您确保列表&lt;&gt;您实际传入方法的地方已在某处初始化,如

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

列表不会指向null。它将是一个零填充列表。