gpt4 book ai didi

c# - 我是否必须取消订阅局部变量的匿名事件处理程序?

转载 作者:可可西里 更新时间:2023-11-01 08:38:20 25 4
gpt4 key购买 nike

如果我有一个看起来像这样的代码:

public void Foo()
{
Bar bar = new Bar();

bar.SomeEvent += (sender, e) =>
{
//Do something here
};

bar.DoSomeOtherThingAndRaiseSomeEvent();
}

当方法超出范围时,bar 是否会被收集,或者我是否必须手动取消订阅该事件以防止由于对 SomeEvent 的引用而发生内存泄漏>?

最佳答案

你的情况很好; 订阅者 事件不会阻止收集发布者,但可能会发生相反的情况。

例如,

class Foo
{
public event EventHandler FooEvent;

void LeakMemory()
{
Bar bar = new Bar();

bar.AttachEvent(this);
}
}

class Bar
{
void AttachEvent(Foo foo)
{
foo.FooEvent += (sender, e) => { };
}
}

在这种情况下,在 LeakMemory 中创建的 Bar 的实例无法被收集,直到其中之一

  • FooEvent 的调用列表中删除由 lambda 表示的匿名方法
  • 可以收集它所附加的 Foo 实例

这是因为事件(它只是普通 delegate 实例的一些语法糖)在它被调用时持有要调用的委托(delegate)列表,而这些委托(delegate)中的每一个依次具有,对其附加的对象的引用(在本例中为 Bar 的实例)。

请注意,我们在这里只讨论集合资格。仅仅因为它符合条件并没有说明任何关于何时(或者甚至,真的,如果)它会被收集,只是它可以 .

关于c# - 我是否必须取消订阅局部变量的匿名事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081638/

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