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调用。

我明白了。谢谢我对事件持谨慎态度;一次咬我一口。