【发布时间】:2021-10-06 20:33:52
【问题描述】:
为什么当事件处理程序被定义为函数时,C# 允许取消订阅事件,而当事件处理程序被定义为委托时却不允许?
考虑以下有效的代码:
void SomeFunction()
{
var eventRaiser = ClassRaisingEvent.GetEventRaiser();
void handler(object sender, EventArgs ev)
{
ProcessData(ev);
eventRaiser.OnEvent -= handler;
}
eventRaiser.OnEvent += handler
eventRaiser.Process();
}
但这无法在指定的位置编译:
void SomeFunction()
{
var eventRaiser = ClassRaisingEvent.GetEventRaiser();
DelegateType handler = (object sender, EventArgs ev) =>
{
ProcessData(ev);
eventRaiser.OnEvent -= handler; // FAILS here with "Use of unassigned local variable 'handler '"
}
eventRaiser.OnEvent += handler
eventRaiser.Process();
}
编辑:这个问题不是如何退订。这就是为什么(在技术意义上)函数名称被捕获在函数的范围内,但委托的不是。
EDIT2:答案here(尤其是答案中的第 2 点)解释了我所看到的行为。
【问题讨论】:
-
jpou 如果问题不是关于取消订阅事件,而是关于
Delegate类型的未分配局部变量,您可能应该提供一个与事件无关的更一般的示例。类似于Action action = () => { action(); };。就目前而言,我无法投票支持重新提出您的问题,因为它看起来与How to remove a lambda event handler 非常相似。