我有以下函数。
它的作用是给定一个控件(很可能是窗体),我希望所有符合规则(筛选我想要的控件的函数)的包含在内的控件订阅一个事件(比如说按键按下事件)。
问题是:我该如何取消订阅?或者更重要的是,我需要吗?
因为我将在窗体的Load事件上使用这个函数,如果窗体关闭了,我真的需要取消订阅吗?
(经过一些简单的阅读和对GC的一些了解后,我怀疑我不需要取消订阅,但我不确定)
它的作用是给定一个控件(很可能是窗体),我希望所有符合规则(筛选我想要的控件的函数)的包含在内的控件订阅一个事件(比如说按键按下事件)。
问题是:我该如何取消订阅?或者更重要的是,我需要吗?
因为我将在窗体的Load事件上使用这个函数,如果窗体关闭了,我真的需要取消订阅吗?
(经过一些简单的阅读和对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);
}
}
}
}
这是我第一次尝试使用事件、委托、匿名函数和Lambda表达式,如果我做了什么很蠢的事情,请告诉我。