9

我想这是一个非常愚蠢的问题,但我一直在环顾四周,找不到以下问题的答案。真的很感谢答案阐明了这一点。

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();
}

谢谢!

4

3 回答 3

11

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

潜在的。执行此操作后,您将不再持有对原始DataTable. 只要没有其他东西引用这个对象,它就会有资格进行垃圾回收。在那之后的某个时刻,GC 将运行并收集对象,这反过来又会释放它的内存。

这适用于静态、实例和局部变量。在所有这些场景中,机制都是相同的。

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

话虽这么说,你的第一个例子是一个不好的做法。虽然内存将(最终)被清理,但您执行的额外分配毫无用处,因此最好不要“双重分配”变量。

于 2013-04-19T16:37:41.487 回答
2

简短的回答是所有这些都由垃圾收集器处理。这些实例不会立即被删除,但它们会被标记为“无法访问”并在稍后释放。

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

于 2013-04-19T16:37:29.290 回答
1

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

因此,当您重新分配一个对象时,您只需覆盖它持有的早期值(内存引用)。早期的值现在符合垃圾收集的条件。现在它的垃圾收集器的工作是释放该内存。同样适用于所有类型的变量,包括静态变量

于 2013-04-19T16:40:14.700 回答