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

时间:2013-04-19 16:34:04

标签: c# .net object

我想这是一个非常愚蠢的问题,但我一直在环顾四周,无法在以下问题上找到答案。非常感谢能够解释这个问题的答案。

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

谢谢!

3 个答案:

答案 0 :(得分:11)

  

//是否会销毁先前创建的对象并释放内存?

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

静态,实例和局部变量都是如此。所有这些scnearios的机制都是相同的。

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

话虽这么说,你的第一个例子是一个不好的做法。虽然内存将(最终)得到清理,但您正在执行额外的分配,这些分配没有任何意义,因此最好不要“双重分配”变量。

答案 1 :(得分:2)

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

我建议您阅读MSDN上的Garbage Collection文章

答案 2 :(得分:1)

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

因此,当您重新分配对象时,您只需覆盖它所持有的早期值(内存引用)。现在,较早的值可用于垃圾收集。现在它的垃圾收集器的工作是释放那个记忆。同样适用于各种变量,包括静态