在类析构函数中将事件设置为null

时间:2015-09-27 11:00:42

标签: c# events memory-leaks destructor

在c#中这是一个很好的做法,在类destrcutor中将所有事件处理程序设置为null以确保没有内存泄漏会发生吗?

例如:

~SomeClass()
{
    OnLoaded = null;
    OnUnloaded = null;
}

或者这是非常糟糕的做法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

简短的回答:这是一种不好的做法。

您应该只使用终结器来清理非托管资源。 垃圾收集器可以处理所有托管对象。

实现不必要的终结器会损害性能,因为垃圾收集器还有更多工作要做。具有终结器的对象将从内存中释放2个垃圾收集。

Finalize方法在垃圾收集器从内存中释放对象之前执行。只有在程序无法再访问对象时才会执行此操作 - 因此也无法通过此对象持有的引用访问其他对象。将引用设置为null不会改变任何内容。

您可以在MSDN(https://msdn.microsoft.com/en-us/library/vstudio/ee787088(v=vs.110).aspx)或Eric Lippert的博客上找到有关垃圾收集的更多信息(例如http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/