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

本文关键字:创建 线程 安全 问题 局部变量 是否 | 更新日期: 2023-09-27 18:36:07

我正在使用new关键字将可变类实例初始化为局部变量。然后,我将这个对象作为参数传递给委托。委托是否延长了此变量的生存期? 其他线程是否使用此变量或创建自己的实例?我可能会问显而易见的问题,但我想确定。

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

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

每当传递以某种方式"转义"方法的局部变量时,都会延长其生存期。 在 C# 中,您永远不会对包含对不存在对象的引用的变量进行操作 - 该概念在托管环境中毫无意义。

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

但是,有时这可能更微妙,特别是如果您返回一个 lambda - 一个在局部变量上关闭的 lambda。 在这种情况下,您从 lambda 中引用的所有变量都以与 foo 相同的方式存在。