在c#中这是一个很好的做法,在类destrcutor中将所有事件处理程序设置为null以确保没有内存泄漏会发生吗?
例如:
~SomeClass()
{
OnLoaded = null;
OnUnloaded = null;
}
或者这是非常糟糕的做法吗?
谢谢!
答案 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/)