代表和变量范围

时间:2010-10-05 12:33:45

标签: c# delegates scope

我有以下代码:

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 的最后一个值,而不是调用该函数时该字段的值。

我想这是范围问题,因为函数的参数(pos,time,linearity和relative)是正确的。

有没有办法强制代表在创建时使用名称的值,而不是执行时名称的值?

如果可能的话,我想避免将值存储在使用 ExecuteOnActiveClients 的许多函数中。

提前致谢

麦克

2 个答案:

答案 0 :(得分:4)

目前,委托根本不存储name的值。它正在捕获this,然后在您引用它时使用它来解析this.name

这是匿名方法和lambda表达式的工作方式,并且您无法改变其行为:创建局部变量 是变通方法。 (那仍将捕获该变量而不是其当前值,但您可以确定之后不会更改局部变量的值。)

有关更多信息以及您可以轻易陷入的其他陷阱,我建议您阅读Eric Lippert关于“关闭环路变量被视为有害”(part 1part 2)的博文。 / p>

答案 1 :(得分:2)

在创建委托之前,创建一个包含name值的临时局部变量,并在委托中使用它。