我想这是一个非常愚蠢的问题,但我一直在环顾四周,无法在以下问题上找到答案。非常感谢能够解释这个问题的答案。
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();
}
谢谢!
答案 0 :(得分:11)
//是否会销毁先前创建的对象并释放内存?
潜在。一旦执行此操作,您将不再持有对原始DataTable
的引用。只要没有其他内容引用此对象,它就有资格进行垃圾回收。在此之后的某个时刻,GC将运行,并收集对象,这将反过来释放它的内存。
静态,实例和局部变量都是如此。所有这些scnearios的机制都是相同的。
请注意,如果您引用的对象实现了IDisposable
,最好在丢失引用之前在其上调用Dispose()
。从技术上讲,正确实现的IDisposable
实现将最终正确处理事情,但本机资源可能会被捆绑,直到GC收集发生,这可能不会很快发生。请注意,这与(托管)内存无关,但仍然是一种很好的做法。
话虽这么说,你的第一个例子是一个不好的做法。虽然内存将(最终)得到清理,但您正在执行额外的分配,这些分配没有任何意义,因此最好不要“双重分配”变量。
答案 1 :(得分:2)
简短的回答是所有这些都是由垃圾收集器处理的。实例不会立即删除,但会被标记为“无法访问”并在以后释放。
我建议您阅读MSDN上的Garbage Collection文章
答案 2 :(得分:1)
对象是C#中的引用变量。这意味着它们将内存引用存储在其中。
因此,当您重新分配对象时,您只需覆盖它所持有的早期值(内存引用)。现在,较早的值可用于垃圾收集。现在它的垃圾收集器的工作是释放那个记忆。同样适用于各种变量,包括静态