class A{
   Action a,b;
   void Test1(){
     int i=new Random().Next(0,100);
     this.a=()=>{
       Console.WriteLine(2*i);
     };
   }
   void Test2(){
     int i=new Random().Next(0,100);
     this.a=()=>{
       Console.WriteLine(2*i);
     };
     this.b=()=>{
       Console.WriteLine(3*i);
     };
   }
   void App(){
     this.Test1();
     this.a.Invoke();
   }
}
//
在Test1中使用闭包模式,为类级别变量a赋值
然后在App中调用注意次序,当Test1调用完成后Test1内部变量都已经被清理
但是位于Test1内部的闭包定义,导致了一个编译器内部类的生成由这个类
保存了Test1中的变量还有,this.a本身的引用(方法引用),
这些没问题吧,现在如果我将Test1改成Test2那么Test2里定义的闭包模式也会
有一个编译器自动生成的内部类支持吗? 就整个类A而言,Test1,Test2产生的
内部类是同一个吗?

解决方案 »

  1.   

    闭包的理解很简单就是封装context实际感觉你之所以问这样的问题是对闭包的本质不清楚,就是一段封装好的上下文就程序而言就是i不释放而已,被闭包保存在了上下文结构中还有就是你一个实例被两次调用c#3.5我没写过,不过 closure 这种概念很常用,感觉你太被语法所困扰了,而没有去考虑问题的实质
      

  2.   

    如果是同一个对象的话,上下文应该是同一个才对。我感觉闭包有点想把局部变量部分全局化了,也就是在所有闭包的方法引用中全局化。我才写过一个类似的闭包过程,估计更能说明问题:
    foreach(Control ctl in this.Controls)
    {
        ctl.MouseDown += (sender1, e1) => {                    
          if (e1.Button == MouseButtons.Left)
          {
              if (ctl is Button)
              {
                  MessageBox.Show("true");
              }
              else
              {
                  MessageBox.Show("false");
              }
          }};
    }当然,所有Control中,有很多不是Button。猜猜看,当我点中了Button,会输出什么——“false”。