【问题标题】:Set events to null in class destructor在类析构函数中将事件设置为 null
【发布时间】:2015-12-24 18:18:48
【问题描述】:

在 C# 中将所有事件处理程序设置为 null 以确保不会发生 内存泄漏 是否是一个好习惯?

例如:

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

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

谢谢!

【问题讨论】:

    标签: c# events memory-leaks destructor


    【解决方案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/)上找到有关垃圾收集的更多信息

    【讨论】:

    • 是否可以在 Window (WPF) 关闭事件中将所有事件设置为 null,以确保可以收集和完成对象?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2018-11-05
    • 2017-08-11
    相关资源
    最近更新 更多