是否可以在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];
但仍然有流行的价值观。谢谢!
答案 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)
正如其他人所说,它取决于你放入数组的类型语义。
值类型(例如int
,bool
和float
)是......好吧,值。它们代表一种数量,一种有形的东西,一种国家。因此,它们需要在编译时知道并具有默认值。
相比之下,引用类型(基本上每个类)本身并不实际拥有任何值,而是通过引用将“数据”组合在一起。引用类型将指向其他引用类型,或最终指向值类型(包含实际数据)。
这种区别对您的问题很重要。 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
。
因为值类型对象具有一些默认值。