【问题标题】:Avoiding event memory leak避免事件内存泄漏
【发布时间】:2015-09-11 09:42:36
【问题描述】:

我知道 .NET 中有类似“EventHandlerManager”的东西。如果您在释放对象之前不取消订阅事件,我已经阅读了有关内存泄漏的信息...

我有以下代码:

    public Person CurrentPerson
    {
        get { return currentPerson; }
        set
        {
            if (currentPerson!= null) currentPerson.PropertyChanged -= propertyChanged;
            currentPerson= value;
            currentPerson.PropertyChanged += propertyChanged;
            RaisePropertyChanged(() => CurrentPerson);
        }
    }

此属性类似于临时占位符,每当我调用时:

CurrentPerson = new Person();

我想听它的 propertyChange 事件...我不确定是否在事件处理的情况下防止内存泄漏。

感谢帮助

【问题讨论】:

  • 如何处置具有 CurrentPerson 属性的对象。当包含属性的对象被销毁时,您需要取消订阅 PropertyChanged 事件。
  • 这段代码非常荒谬,让一个类监听自己的事件毫无意义。您可以直接调用 this.propertyChanged() 来代替。但至少有一个优点,它不可能导致任何泄漏。
  • Hans Passant,此代码来自我的视图模型... CurrentPerson 未在“Person”类本身中实现。

标签: c# .net memory-leaks


【解决方案1】:

这不会导致任何内存泄漏。由于您在删除对对象的引用之前取消订阅该事件,然后在它进入时连接到新的事件,这是正确的并且不会导致内存泄漏。正如 Ivan 提到的,您需要确保在处置对象时取消订阅事件,有几种方法可以控制对象的销毁。要么通过创建 ~(classname) 方法来创建析构函数,要么实现 IDisposable 如果您还有其他外部事物要清理。完成对象后调用 Dispose,您应该确信已完成对象的清理和处置,然后您可以取消引用该对象。

附带说明,如果这是您的代码实际布局的结构,如果 Person 可以为空,如果某些东西将 null 分配给您的 CurrentPerson 属性,您将得到一个异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2013-06-24
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多