C# 必须以代表身份取消订阅活动吗?
我想在用户按下按钮时使用这个小上下文菜单:C# 必须以代表身份取消订阅活动吗?,c#,events,C#,Events,我想在用户按下按钮时使用这个小上下文菜单: private ContextMenuStrip TaskMenu() { ContextMenuStrip Result = new ContextMenuStrip(); Result.Items.Add("Select task to start:"); Result.Items.AddRange( System.IO.Directory.GetFiles("C:\\Settings\\Tasks", tr
private ContextMenuStrip TaskMenu()
{
ContextMenuStrip Result = new ContextMenuStrip();
Result.Items.Add("Select task to start:");
Result.Items.AddRange(
System.IO.Directory.GetFiles("C:\\Settings\\Tasks", true), "*.tsk")
.Select(qF => new ToolStripMenuItem(System.IO.Path.GetFileNameWithoutExtension(qF)) { Tag = qF, Checked = qF == this.TaskFile })
.ToArray());
Result.Items.Add("Cancel");
Result.ItemClicked += new ToolStripItemClickedEventHandler(
delegate(object s, ToolStripItemClickedEventArgs ev) { StartScan((string)ev.ClickedItem.Tag); });
return Result;
}
但是,我不应该,因为我从来没有退订过这个活动。对吗?这里应该没有问题<代码>结果是在方法内部创建的,因此不可能两次附加相同的事件处理程序 当对
Result
的最后一次引用超出范围时,它就有资格进行垃圾收集。只要此方法之外没有任何内容保持对结果的永久引用,当垃圾被收集时,它和对委托的引用都将被清除
我不应该,因为我从来没有退订过这个活动,对吧
如果您需要在某个时刻取消事件挂钩,那么这不是正确的方法。解决方法是引用处理程序,以便以后可以取消订阅
如果您纯粹是从内存泄漏的角度担心,那么就不要担心。当您的ContextMenuStrip
被GC调用时,您的委托也会被GC调用。我明白了。谢谢我对事件持谨慎态度;一次咬我一口。