在 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/)
上找到有关垃圾回收的更多信息
在 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/)
上找到有关垃圾回收的更多信息