gpt4 book ai didi

c# - 删除析构函数中的事件处理程序,以防发布者和订阅者相互引用

转载 作者:行者123 更新时间:2023-12-05 01:21:35 25 4
gpt4 key购买 nike

假设我们有以下模型:

    public class Bar<T>:List<T>
{
public delegate void CollectionChangedDelegate();
public event CollectionChangedDelegate CollectionChanged;
}

public class Foo
{
Bar<object> MyCollection = new Bar<object>();

public Foo()
{
MyCollection.CollectionChanged += new Bar<object>.CollectionChangedDelegate(MyCollection_CollectionChanged);
}

public void MyCollection_CollectionChanged()
{
//Do Something
}

~Foo() //Would this work ?
{
MyCollection.CollectionChanged -= MyCollection_CollectionChanged;
}
}

在这种情况下可以调用类 Foo 的析构函数吗?

最佳答案

这样做没有意义。让我们假设有这样的订阅。现在,为了让我们到达 ~Foo 方法,我们必须被收集,所以我们必须是不可访问的。由于事件的运作方式,订阅让我们可以访问(发布者有对订阅者的引用)——所以我们可以推断 MyCollection 也是无法到达。如果不是,我们就不会被收集。

如果 MyCollection 不可访问,那么它要么已经被收集,要么即将被收集。无需退订。

删除~Foo:这里没有意义;实际上,它比毫无意义更糟 - 除了毫无用处之外,它还迫使垃圾收集器通过一个额外的步骤(终结器队列)插入该对象。

但是,您可能想要添加某种确定性 清理来执行此操作;正如 Joroen 指出的那样,IDisposable 可能有用 - 但是,在不了解更多上下文的情况下很难说它是否适合这种情况。

关于c# - 删除析构函数中的事件处理程序,以防发布者和订阅者相互引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18355968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com