C# 调用从表达式创建的操作<;行动>;在另一个范围内

C# 调用从表达式创建的操作<;行动>;在另一个范围内,c#,.net-3.5,delegates,lambda,C#,.net 3.5,Delegates,Lambda,考虑以下简单示例: private Action _action; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string msg = "test"; Expression<Action> exp = () => MessageBox.Show(msg); _action = exp.Compil

考虑以下简单示例:

private Action _action;

public Form1() { InitializeComponent(); }

private void button1_Click(object sender, EventArgs e)
{
    string msg = "test";
    Expression<Action> exp = () => MessageBox.Show(msg);
    _action = exp.Compile();
    msg = "testC";
}

private void button2_Click(object sender, EventArgs e)
{
    _action();
}
private Action\u Action;
公共表单1(){InitializeComponent();}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串msg=“测试”;
表达没有多大帮助

我正在创建一个支持要执行的高优先级操作的作业管理器。有一堆默认操作和一些需要添加的高优先级操作。这部分是我注册高优先级作业的地方(使用lambda->get the method->create delegate->store it->run in when need)。我不确定这是否是存储操作的正确方法。

是的,您可以。
lambda表达式创建一个闭包,该闭包保存对它从外部函数使用的局部变量的引用

此闭包在代理的
Target
属性中引用。
只要您持有对委托的引用,这些变量就不会被GC'd


有关此操作的更多详细信息,请参见。

为什么要创建表达式并编译它,而不是从lambda开始创建操作?@Servy如前所述
我怀疑这是正确的方法。
。谢谢你的提示。我被引导到了这种方法,并了解了参数的用法。你所需要的一切要做的是使用
\u action=()=>MessageBox.Show(msg);
。至于它是存储引用还是值,只需执行代码(您执行过的代码)就可以给出答案,不是吗?我需要多一点理论。不过我可以看到它是有效的!