如果我将新数组分配给现有值类型数组会发生什么?

nic*_*wkc 0 c#

假设我有以下代码:

float[] test = new float[10];
for(int i = 0; i < 10; i++)
{
     test[i] = i + 1.0f;
}
Run Code Online (Sandbox Code Playgroud)

我将一个新的浮点数重新分配给测试数组,如下所示:

test = new float[10];
Run Code Online (Sandbox Code Playgroud)

通过Console.WriteLine调试后,显示reassign的test值为0,test是不是引用了新创建的float数组,还是之前的数组被清空重新创建?

我已经阅读了一些关于堆和堆栈的文章,但这并没有解决我的困惑。

npi*_*nti 6

在深处,test是一个指向一定大小的内存块的指针sizeof(float) * 10)(该块可能有点大,但超出了点)。

在循环中,您开始将值放入该内存块中。然后,当你这样做时test = new float[10];,CLR 会给你一个指向内存中新块的新指针。

内存中的前一个块将在未来的某个时刻被垃圾收集器回收(除非它在其他地方被使用)。

  • 可预测的?不,但比这更疯狂。托管内存模拟具有无限内存的计算机。正确编写的程序不能假设内存将被收集(作为本文中提出的观点的推论......)[每个人都以错误的方式看待垃圾收集](https://devblogs.microsoft.com/oldnewthing/ 20100809-00/?p=13203)。 (2认同)