gpt4 book ai didi

c# - 取消订阅事件

转载 作者:太空狗 更新时间:2023-10-30 01:27:52 25 4
gpt4 key购买 nike

我有以下功能。

它的作用是,给定一个控件(很可能是一个 Windows 窗体),我想让所有控件包含“遵守”规则(一个筛选我想要的控件的函数)订阅一个事件(比方说 KeyDown)。

问题是:我如何退订?或者更重要的是,我需要吗?

因为我将在表单本身的表单加载事件中使用这个,如果表单关闭,我真的需要取消订阅吗?

(经过简单阅读和对 GC 的一些了解后,我怀疑我不需要取消订阅,但我不确定)

//an example of using the function
private void Form1_Load(object sender, EventArgs e)
{
MyEventHandler.CreateKeyDownEventHandlers(this);
}

//the function
public static void CreateEventHandlers(Control Ctrl)
{
foreach (Control c in Ctrl.Controls)
{
//bool Rules(Control) a function that determines to what controls'
//events to apply the handler
if ( Rules(c) )
{
c.KeyDown += (s, e) =>
{
// do something
};

}

//a control might be a groupbox so we want their contained
//controls also
if (c.Controls != null)
{
if (c.Controls.Count > 0)
{
CreateEventHandlers(c);
}
}

}
}

这是我第一次尝试使用事件、委托(delegate)、匿名函数和 lambda,所以如果我做了一些非常愚蠢的事情,请告诉我。

最佳答案

首先,我认为您不能取消订阅匿名函数,除非它被分配给一个处理程序变量并且该变量被添加到事件中然后从事件中删除。

是否需要取消订阅:考虑对象的生命周期。您在静态方法中创建匿名函数并将其附加到我假设您控制其生命周期的控件。

当您处置其中一个控件时,它们将不再引用匿名函数,GC 可以终止它们(匿名函数),因此您不需要取消订阅。 p>

如果情况相反,在静态方法中创建的东西引用了控件,就好像控件委托(delegate)被添加到静态上下文中的事件,那么 GC 无法处理控件,直到引用对它们的删除,如果在静态方法中完成则不会发生这种情况。

关于c# - 取消订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108422/

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