假设我创建声明一个数组:
byte[] Data = new byte[4];
我玩数组,用一些值填充它等等。稍后在代码中,如果我说:
Data = new byte[16];
我在做什么:我是否完成摆脱旧数组并创建一个包含16个索引的新数组?或者我保持与以前相同的数组,但只是扩展索引的总数?
答案 0 :(得分:4)
我在做什么:我是否完成摆脱旧数组并创建一个包含16个索引的新数组?
是。旧阵列最终将被垃圾收集,并且只是“消失”#34; (没有提供任何其他参考)。您的新数组不会保留任何原始值。
或者我保持与以前相同的数组,但只是扩展索引的总数?
你不是。如果您想要这种行为,请考虑使用List<byte>
,它与数组非常相似,但会根据需要增长。
您还可以使用Array.Resize(Data, 16)
来&#34;调整大小&#34;数组。在内部,这将创建一个新数组,然后将旧数组中的值复制到新数组,因此结果的长度为16,但仍保留原始的4个值。
答案 1 :(得分:1)
您没有增加现有阵列。 Data
是一个引用,您正在发生的事情是将该引用分配给新的内存块(已分配的byte[16]
),并假设没有其他引用等于Data
你正在孤立你先前分配的内存,这将导致它被垃圾收集。如果说,你做了;
var Data = new byte[4];
var Data1 = Data;
Data = new byte[16];
然后原始的四个字节的内存不会排队等待垃圾收集,直到Data1
超出范围,因为你仍然有对该内存的引用。
答案 2 :(得分:0)
您正在创建一个新数组并将其设置为旧数组的引用。
一旦所有引用从对象中消失,垃圾收集器就会将其拾取并从内存中删除它。
答案 3 :(得分:0)
创建数组时,在那种情况下,已在内部创建了Array类对象。
byte [] Data = new byte [4];
在这一行中Data只是一个指向内存的引用变量。
数据=新字节[16];
执行此语句时,表示您已创建新数组并将其引用传递给Data引用变量。现在它丢失了旧数组并指出了新数组。