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的值,而不是当前值。你能重新阅读,重新措辞你的问题,以消除歧义,干杯。这就是我所想的。。。那我就不得不这样做了。谢谢