调用从<Action>另一个作用域中的表达式创建的操作



考虑以下简单示例:

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();
}

单击按钮2时,我看到testC

我的问题是:

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

我的问题主要是关于方法参数。我不知道它们是如何存储的(通过参考或价值),同时GC是否可以清除它们。总的来说,我怀疑这是正确的方法。另外,MSDN没有太大帮助。

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

是的,你可以。
lambda表达式创建了闭合,该在其外部函数中使用的局部变量引用。

在代表的Target属性中引用了此关闭。
只要您对代表的引用,这些变量就不会被gc'd。

有关其工作原理的更详细观察,请参阅我的博客文章。

最新更新