testit()方法是一个闭包。虽然aString已经超出了范围,但testit()仍然可以在其上执行。testit2()正在使用一个没有超出范围(mystring)的变量,但它也没有被传递到testit2()中。testit2()是否被认为是闭包?
string mystring = "hello world";
Action testit = new Action(delegate { string aString = "in anon method"; Debug.WriteLine(aString); });
testit();
//capture mystring. Is this still a closure?
Action testit2 = new Action(delegate { Debug.WriteLine(mystring); });
//mystring is still in scope
testit2();
在第二个例子中,mystring可以在方法外部进行更新,并且这些更改将反映在testit2()中。这与普通方法的行为不同,普通方法只能将mystring作为参数捕获。