【发布时间】:2015-12-24 18:18:48
【问题描述】:
在 C# 中将所有事件处理程序设置为 null 以确保不会发生 内存泄漏 是否是一个好习惯?
例如:
~SomeClass()
{
OnLoaded = null;
OnUnloaded = null;
}
或者这真的是不好的做法?
谢谢!
【问题讨论】:
标签: c# events memory-leaks destructor
在 C# 中将所有事件处理程序设置为 null 以确保不会发生 内存泄漏 是否是一个好习惯?
例如:
~SomeClass()
{
OnLoaded = null;
OnUnloaded = null;
}
或者这真的是不好的做法?
谢谢!
【问题讨论】:
标签: c# events memory-leaks destructor
简短回答:这是一种不好的做法。
您应该只使用终结器来清理非托管资源。 垃圾收集器可以处理所有托管对象。
实现不必要的终结器会损害性能,因为垃圾收集器还有更多工作要做。带有终结器的对象需要 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/)上找到有关垃圾收集的更多信息
【讨论】: