委托是否使用局部变量创建线程安全问题?

时间:2012-06-04 00:10:10

标签: c# delegates scope local-variables

我正在使用new关键字将可变类实例初始化为局部变量。然后我将此对象作为参数传递给委托。该变量的生命周期是否由代表扩展?其他线程是否使用此变量或创建自己的实例?我可能会问明显但我想确定。

public void DoSometing(Action<Foo> action)
{
    Foo foo = new Foo();
    action.Invoke(foo);
}

1 个答案:

答案 0 :(得分:3)

每当您传递以某种方式“转义”方法的局部变量时,执行延长其生命周期。在C#中,您永远不会对包含对不存在对象的引用的变量进行操作 - 这个概念在托管环境中没有意义。

所以是的,foo将继续存在,你将需要关注线程安全,就像你简单地调用另一个普通方法一样。在这种情况下,lambdas不会改变问题的面貌。

然而,有时这可能会更加微妙,特别是如果你返回一个lambda - 一个closes超过局部变量的lambda。在这种情况下,您在lambda中引用的所有变量都以与foo相同的方式存在。