我有以下功能。
它的作用是,给定一个控件(很可能是一个 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);
}
}
}
}
这是我第一次尝试使用事件、委托、匿名函数和 lambda,所以如果我做了一些非常愚蠢的事情,请告诉我。