C# 委托和变量范围
我有以下代码:C# 委托和变量范围,c#,delegates,scope,C#,Delegates,Scope,我有以下代码: public void SetMove(Position3D pos, float time, float linearity, bool relative) { ExecuteOnActiveClients(delegate(NeuroClient client) { client.Engine.GetProcAnimation(name)
public void SetMove(Position3D pos, float time, float linearity, bool relative)
{
ExecuteOnActiveClients(delegate(NeuroClient client)
{
client.Engine.GetProcAnimation(name).SetMove(pos, time, linearity, relative);
}, true, true);
}
其中ExecuteOnActiveClients将委托推送到队列中,异步使用,并具有以下签名:
void ExecuteOnActiveClients(ClientDelegate action, Boolean parallel, Boolean wait, Boolean lockClient)
我有很多函数,看起来像这个,可以同时调用
我注意到,在执行ExecuteOnActiveClients之前,我必须将name(类的私有字段)的值存储在函数中的变量中,以使此代码正常工作,因为如果我不这样做,代理将使用name的最后一个值,而不是调用函数时字段的值
我想这是一个范围问题,因为函数的参数(位置、时间、线性和相对)是正确的
是否有办法强制委托在创建时使用名称的值,而在执行时不使用名称的值
如果可能的话,我希望避免将值存储在使用ExecuteOnActiveClient的每一个函数中
提前谢谢
Mike在创建代理之前,创建一个包含name值的临时局部变量,并在代理中使用该变量。当前代理根本没有存储name的值。它捕获
这个
,然后使用它来解析这个.name
,只要你引用它
匿名方法和lambda表达式都是这样工作的,您无法改变它们的行为:创建局部变量是解决方法。(这仍将捕获该变量,而不是其当前值,但您可以确保以后不会更改局部变量的值。)
要了解更多信息,以及另一个您很容易陷入的陷阱,我建议您阅读Eric Lippert关于“关闭被认为有害的循环变量”(,)的博客帖子。我很困惑,您说调用ExecuteOnActiveClient时使用的是name的最后一个值,而不是调用时的值,然后您说希望在声明时使用name的值,而不是当前值。你能重新阅读,重新措辞你的问题,以消除歧义,干杯。这就是我所想的。。。那我就不得不这样做了。谢谢