考虑以下简单示例:
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。
有关其工作原理的更详细观察,请参阅我的博客文章。