假设我的功能如下:
void myFunc(List<AClass> theList)
{
string[] stuff = new string[theList.Count];
}
我传了一个空列表。
东西会是空指针吗?或者它是指向未初始化的内存中某个随机位置的指针?
答案 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。它将是一个零填充列表。