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

Set events to null in class destructor

在 c# 中,将 class 析构函数中的所有事件处理程序设置为 null 以确保不会发生 内存泄漏 是否是一个好习惯?

例如:

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

或者这真的是不好的做法吗?

谢谢!

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

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

实施不必要的终结器会损害性能,因为垃圾收集器有更多工作要做。带有终结器的对象需要 2 次垃圾回收才能从内存中释放。

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

您可以在 MSDN (https://msdn.microsoft.com/en-us/library/vstudio/ee787088(v=vs.110).aspx) or Eric Lippert's blog (e.g. http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/)

上找到有关垃圾回收的更多信息