gpt4 book ai didi

c# - 事件处理程序和匿名委托(delegate)/Lambda 表达式

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

我希望通过使用匿名委托(delegate)和 lambda 表达式来为 C# 中的事件处理程序创建方法来解决一些问题,至少对我自己而言。

假设我们有一个添加匿名委托(delegate)或 lambda 表达式的事件(对于可以使用较新版本 .NET 的幸运人群)。

SomeClass.SomeEvent += delegate(object o, EventArg e) { /* do something */ };

我读到,过去的人们已经忘记了仍然有处理程序阻止类被垃圾收集的事件。如果不在类中将 SomeEvent 设置为 null,将如何删除添加的处理程序。以下不是一个全新的处理程序吗?

SomeClass.SomeEvent -= delegate(object o, EventArg e) { /* do something */ };

我可以看到将匿名委托(delegate)或 lambda 表达式存储在变量中。但是,至少对我来说,这似乎违背了能够简单而简洁地添加事件处理程序的全部目的。

SomeEventDelegate handler = new SomeEventDelegate(delegate(object o, EventArg e) { /* do something */ });
SomeClass.SomeEvent += handler;
// ... stuff
SomeClass.SomeEvent -= handler;

再一次,我知道你可以做...

public override Dispose(bool disposing)
{
_someEvent = null;
this.Dispose();
}

但我更感兴趣的是从事件中删除动态创建的方法。希望有人能为我阐明这一点。谢谢!

最佳答案

如果对象 X 有一个事件处理程序,其目标 是对象 Y,则对象 X 处于事件状态意味着对象 Y 不能被垃圾回收。它不会阻止对象 X 被垃圾回收。

通常当一些东西被处理后,它很快就会变成垃圾,这意味着你没有问题。

事件和 GC 的问题是,如果您忘记从不同 对象中删除订阅的处理程序 - 即您有一个已处理的监听器,但永远不会被垃圾收集,因为仍然有一个引用从另一个对象中的事件到它。

关于c# - 事件处理程序和匿名委托(delegate)/Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/439166/

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