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/

10-12 02:49