如果我覆盖'new'列表,是旧的一个被删除

本文关键字:一个 删除 覆盖 new 列表 如果 | 更新日期: 2023-09-27 18:17:52

我想在c#中重新初始化List -本质上是擦除它并再次填充它。

如果我通过使用new关键字赋值来再次初始化列表,旧的列表是否仍然在某处徘徊,或者我是否成功地覆盖了它?

如果我覆盖'new'列表,是旧的一个被删除

如果我通过使用new关键字赋值来再次初始化列表,旧的列表是否仍然在某处徘徊,或者我是否成功地覆盖了它?

旧的会一直存在一段时间,直到垃圾收集器出现。
当然,前提是您没有在其他任何地方存储对List的引用。

你只能覆盖指向List的引用变量,而不能覆盖List本身。

更重要的是:一般来说,这是正确的做法。只要在你需要的时候创建一个新的对象/列表,不用担心(麻烦)旧的状态等

如果该列表没有其他引用,则该列表将被垃圾收集器删除。请记住,如果你有两个变量引用同一个列表,你将一个新列表分配给一个变量,但另一个变量仍然指向原始列表。

你描述的你想做的事情和你描述的你想做的事情不匹配。

如果您想保留List<T>对象并擦除它,您将使用Clear方法:

myList.Clear();

这将删除列表中的所有项,但您保留相同的实例。它也将保持相同的容量,即用于保存项的底层数组被保留。

如果您使用new关键字,您将创建一个新的实例。例子:

myList = new List<int>();

对新实例的引用将取代对前一个实例的引用。除非有对该实例的另一个引用,否则它将被用于垃圾收集。下次垃圾回收器运行时,很可能会删除前一个实例。

但这并不能保证。如果列表已经存在了很长时间,它可能已经被移动到第二代或第三代堆,在这种情况下,它将留在内存中,直到垃圾收集器决定执行比第一代堆更多的收集。