C#温故而知新系列教程之闭包

2020-01-05 09:36:07王冬梅


using System;

namespace closure
{
 class Program
 {
 static void Main(string[] args)
 {
 Console.WriteLine(test(1)(2));
 Console.ReadKey();
 }

 public static Func<int,int> test(int x)
 {
 //作用域1
 return (y) => 
 {
 //作用域2
 return x + y;
 };
 }
 }
}

可以看到我们test的方法中传入变量x的作用域是在1 在执行匿名函数的时候应该是已经释放在作用域2就不应该存在了,而我们却能准确的得到计算结果   

C#,闭包

说明我们的变量x确实在作用域2中还存在,接下来我们看看编译器帮我们做了什么事情,

C#,闭包

可以看到我们的test方法中多了一个对象 <>c__DisplayClass1_0  class_;这个东西的具体定义是啥?

C#,闭包

这个很明显了,其实闭包只是编译器帮我们把自由变量封装到了一个对象中供我们作用域外使用,那我们如果去掉作用域2中使用x变量呢?