gpt4 book ai didi

c# - 即使在方法完成后线程如何访问局部变量?

转载 作者:可可西里 更新时间:2023-11-01 08:55:21 24 4
gpt4 key购买 nike

假设我有一个这样的 C# 方法

public void MyMethod()
{
int i = 0;

var thread = new Thread(() =>
{
Thread.Sleep(100);

if (i == 0)
{
Console.WriteLine("Value not changed and is {0}", i);
}
else
{
Console.WriteLine(" Value changed to {0}.", i);
}
});

thread.Start();


i = 1;
}

这里的方法创建了一个线程,该线程访问在方法中创建的局部变量。当它访问这个变量时,方法已经完成,因此局部变量 i 不应该存在。但是代码运行没有任何问题。根据我的理解,局部变量在方法 block 完成后不存在。我无法得到这个。

最佳答案

之所以可行,是因为编译器重写了您的代码以使用 closure .

由于您在 lambda 中使用变量,因此变量最终会更改为类的成员。编译后的代码不包含 i 的局部变量 - 即使您是那样写的。相反,它会重写您的代码以使用包含 Int32 作为成员变量的编译器生成的类,并且“本地代码”和 lambda 会引用此类成员。

有关详细信息,请参阅此 blog post on closures这让您大致了解编译器在这里做了什么。

关于c# - 即使在方法完成后线程如何访问局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com