gpt4 book ai didi

c# - Lambda 事件处理程序范围

转载 作者:太空狗 更新时间:2023-10-30 01:24:11 25 4
gpt4 key购买 nike

谁能给我一个 Eloquent 、深入的解释为什么这样可以:

EventHandler e;

private void foobar(){
e = new EventHandler((o, s) => {
somectl.LayoutUpdated -= e;
}
somectl.LayoutUpdated += e;
}

但这不是:

private void foobar(){
EventHandler e = new EventHandler((o, s) => {
somectl.LayoutUpdated -= e;
}
somectl.LayoutUpdated += e;
}

这也不是:

private void foobar(){
EventHandler e;
e = new EventHandler((o, s) => {
somectl.LayoutUpdated -= e;
}
somectl.LayoutUpdated += e;
}

最佳答案

这与 lambda 的关系没有您想象的那么大。例如,这会失败:

int i = i + 1;

就像这样:

int i;
if (condition) {i = 0;}
i = i + 1;

或者:

int i;
if (condition) {Console.WriteLine(i);}
i = 1;

lambda 表达式失败的原因相同:中间一个是因为你不能在它的声明中引用任何变量,最后一个是因为你不能保证 e 会被初始化在您尝试在 lambda 中使用它之前。

第一个示例工作正常,因为字段 总是被初始化。它们要么在类的构造函数中被赋予一个值,要么被自动设置为默认值。如果你想让它在方法的范围内工作,你只需要在声明它时分配你的变量。

private void foobar(){
EventHandler e = null;
e = new EventHandler((o, s) => {
somectl.LayoutUpdated -= e;
}
somectl.LayoutUpdated += e;
}

关于c# - Lambda 事件处理程序范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10125359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com