调用从另一个范围</action>中的Expression <action>创建的Action

时间:2012-11-06 14:54:40

标签: 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.Compile();
    msg = "testC";
}

private void button2_Click(object sender, EventArgs e)
{
    _action();
}

点击button2后,我会看到testC

我的问题是:

我想存储稍后要运行的操作。我可以安全地存储compile()创建的代理并随时使用它吗?

我的问题主要是关于方法论证。我不知道它们如何被存储(通过ref或值),如果它们可以在此期间由GC清除它们。总的来说,我怀疑这是正确的方法。此外,msdn没有多大帮助。

我正在创建一个支持要执行的高优先级操作的JobManager。有一堆默认操作和一些需要添加的高优先级。这部分是我注册高优先级作业的地方(使用lambda - &gt;获取方法 - &gt;创建委托 - &gt;存储它 - &gt;在需要时运行)。我不确定这是否是存储操作的正确方法。

1 个答案:

答案 0 :(得分:3)

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

此闭包在委托的Target属性中引用 只要您持有对委托的引用,那些变量就不会是GC。

有关其工作原理的详细信息,请参阅my blog post