C#Clear Array但不填充List.Clear的0替代(获取大小回到0)

时间:2014-10-04 06:37:44

标签: c# arrays

是否可以在C#中完全删除Array,但不能用0填充它:

for(int i=0;i<a.Length;i++)
{
a[i]=0;
}

Array.Clear(a,0,a.Length);

但要以List.Clear()这样做的方式清除它,以便它的大小在填充之前再次为0。 我试过了 a=new int[15];但仍然有流行的价值观。谢谢!

3 个答案:

答案 0 :(得分:4)

C#中的数组是固定长度的;你不能改变数组的大小。你可以分配一个不同大小的数组并复制元素以模拟调整大小(这正是List<T>内部所做的那样),但你不能“清除数组”,因为你将它减少为零元素

  

我尝试了a=new int[15];,但仍然存在流行值。

以前的值不可能仍然存在,因为这会分配一个包含15个元素的新int数组,其中所有元素都为零。

请注意,此不会更改a引用的数组;相反,它会创建一个 new 数组,并在a中存储对它的引用。因此,如果您从另一个数组变量初始化a,它们将引用相同的数组,但在将新数组分配给a之后,另一个变量将继续指向旧数组。也许这就是“以前的价值观”的来源。

var a = new int[] { 1, 2, 3 };
var b = a;

// a and b now reference the same array.

a = new int[] { 4, 5, 6 };

// a is now {4,5,6} but b remains {1,2,3}

答案 1 :(得分:1)

正如其他人所说,它取决于你放入数组的类型语义。

值类型(例如intboolfloat)是......好吧,值。它们代表一种数量,一种有形的东西,一种国家。因此,它们需要在编译时知道并具有默认值。

相比之下,引用类型(基本上每个类)本身并不实际拥有任何值,而是通过引用将“数据”组合在一起。引用类型将指向其他引用类型,或最终指向值类型(包含实际数据)。

这种区别对您的问题很重要。 List<T>是一个动态大小的集合,可以在不创建新对象的情况下增长或缩小,因为它的实现方式。列表中的每个元素都指向下一个元素,因此无法提前知道它的大小。

数组是一个固定大小的集合,声明为特定大小。数组类型决定系统保留多少内存。例如,100个元素的byte[]将比100个元素的Int64[]数组消耗更少的内存。因此,系统需要提前知道要保留多少字节,这意味着它需要一个默认值来“回退”以满足编译时检查。 T[]是引用类型/类的位置,null。对于值类型,通常为0(或default(T))。

如果你想删除数组的所有值,类似于List.Clear()的工作方式,你可以执行int[] a = new int[0];,但请注意你创建一个全新的数组并重新分配他们的记忆(因此关键字new)。其他对象需要引用这个新数组。按照设计,您不能简单地调整数组大小。列表是可变集合,并支持更改元素的数量。你也可以尝试int[] a = null,但这根本就没有任何对象,这也是不同的东西。

答案 2 :(得分:-1)

这取决于数组的元素是Value类型还是Reference类型。

在您的情况下,它是值类型,因此您必须拥有一些值。您无法为其分配null

因为值类型对象具有一些默认值。