class Program
{
static Action act = null;
static void Main(string[] args)
{
Test();
act();
act();
Test();
act();
}
static void Test()
{
int count = 0;
if(act == null) act = () => Console.Write(++count + " ");
}
}
结果:
1 2 3
为什么?如果
delete
[if(act == null)
]结果:
1 2 1
最佳答案
目前,您只创建了一个委托(delegate)实例。这会捕获第一次调用时在 Test
方法中声明的局部变量。
由于捕获它的委托(delegate),该局部变量实际上具有延长的生命周期。每次调用委托(delegate)时,它都会增加相同的变量。
删除 if (act == null)
条件后,每次调用 Test
时都会创建一个新委托(delegate),这意味着它捕获不同的 count
局部变量,每次从 0 开始。您调用 Test()
两次,并且通过第一次调用创建的委托(delegate)被调用两次(输出 1 然后是 2)。通过第二次调用创建的委托(delegate)仅被调用一次(输出 1)。
关于C# lambda 使用局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58056836/