我正在使用 new 关键字将可变类实例初始化为局部变量。然后我将此对象作为参数传递给委托。委托是否延长了这个变量的生命周期?其他线程是否使用此变量或创建自己的实例?我可能会问显而易见的问题,但我想确定一下。
public void DoSometing(Action<Foo> action)
{
Foo foo = new Foo();
action.Invoke(foo);
}
我正在使用 new 关键字将可变类实例初始化为局部变量。然后我将此对象作为参数传递给委托。委托是否延长了这个变量的生命周期?其他线程是否使用此变量或创建自己的实例?我可能会问显而易见的问题,但我想确定一下。
public void DoSometing(Action<Foo> action)
{
Foo foo = new Foo();
action.Invoke(foo);
}
每当您传递以一种或另一种方式“转义”该方法的局部变量时,您确实会延长其生命周期。在 C# 中,您永远不会对包含对不存在对象的引用的变量进行操作——该概念在托管环境中毫无意义。
所以是的,foo
将继续存在,并且您将需要以完全相同的方式关注线程安全,就像您只是调用另一个普通方法一样。在这种情况下,lambda 不会改变问题的复杂性。
然而,有时这可能更微妙,特别是如果你返回一个 lambda —— 一个封闭局部变量的。在这种情况下,您从 lambda 中引用的所有变量都以与foo
.