3

考虑以下简单示例:

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 -> 获取方法 -> 创建委托 -> 存储它 -> 在需要时运行)。我不确定这是否是存储动作的正确方法。

4

1 回答 1

3

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

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

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

于 2012-11-06T14:56:06.693 回答