考虑以下简单示例:
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;在需要时运行)。我不确定这是否是存储操作的正确方法。
答案 0 :(得分:3)
是的,你可以。
lambda表达式创建一个闭包,它保存对从外部函数使用的局部变量的引用。
此闭包在委托的Target
属性中引用
只要您持有对委托的引用,那些变量就不会是GC。
有关其工作原理的详细信息,请参阅my blog post。