C#Lambda使用局部变量

Sno*_*now 4 c# lambda

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 + " ");
        }
    }  
Run Code Online (Sandbox Code Playgroud)

结果1 2 3为什么?

如果delete[ if(act == null)] 结果1 2 1

Jon*_*eet 10

当前,您仅创建一个委托实例。这将捕获在Test第一次调用该方法时声明的局部变量。

由于捕获了该局部变量,该局部变量有效地延长了生存期。每次调用委托时,它都会增加相同的变量。

删除if (act == null)条件后,每次调用都会创建一个新的委托Test,这意味着它将捕获一个不同的count局部变量,每次均从0开始。您调用了Test()两次,并且通过第一个调用创建的委托被调用了两次(输出为1,然后为2)。通过第二个调用创建的委托仅被调用一次(输出1)。