在同一变量上重复创建新对象

本文关键字:新对象 对象 创建 变量 | 更新日期: 2023-09-27 18:09:59

我想这是一个非常愚蠢的问题,但我一直在寻找周围,无法找到以下问题的答案。非常感谢你的回答能让我明白这一点。

1)如果在同一个方法中实例化一个新对象,前一个对象会发生什么。例子:

DataTable dataTable = new DataTable();
dataTable = new DataTable(); // Will the previously created object be destroyed and memory freed?

2)与(1)相同的问题,但在静态变量上。例子:

static private DataView dataView;
private void RefreshGridView()
{
    dataView = new DataView(GetDataTable()); // Will the previously created objects be destroyed and memory freed?
    BindGridView();
}

谢谢!

在同一变量上重复创建新对象

//之前创建的对象会被销毁并释放内存吗?

可能。一旦这样做,您将不再持有对原始DataTable的引用。只要没有其他对象引用此对象,它就有资格进行垃圾收集。在此之后的某个时刻,GC将运行,并收集对象,这将反过来释放它的内存。

对于静态变量、实例变量和局部变量都是如此。在所有这些情况下,机制是相同的。

请注意,如果您引用的对象实现了IDisposable,那么在丢失引用之前调用Dispose()是一个很好的实践。从技术上讲,正确实现的IDisposable实现将最终正确地处理事情,但是在GC收集发生之前,本机资源可能会被占用,而GC收集可能不会很快发生。请注意,这与(托管)内存无关,但仍然是一个很好的实践。

话虽这么说,你的第一个例子是一个不好的做法。虽然内存(最终)会被清理干净,但您正在执行没有任何用途的额外分配,因此最好不要"双重分配"变量。

简短的回答是,所有这些都由垃圾收集器处理。实例不会立即被删除,但它们将被标记为"不可访问",并在以后的时间释放。

我建议在MSDN上阅读垃圾收集的文章

对象是c#中的引用变量。这意味着它们在其中存储内存引用。

所以当你重新赋值一个对象时,你只需要覆盖它之前保存的值(内存引用)。并且先前的值现在符合垃圾收集的条件。现在是垃圾收集器的工作来释放内存。所有类型的变量都是如此,包括静态