c#2.0匿名方法四(转)

本文探讨了C#中匿名方法如何处理不同作用域内的局部变量。通过具体示例展示了当匿名方法定义在嵌套作用域中时,C#编译器如何创建内部类来封装外部作用域的变量。
匿名方法的作用域和局部变量用法

  我们讨论了在方法的主作用域(the main scope)中的匿名方法的实现。当一个匿名方法在一个嵌套作用域中被定义时,并且匿名方法中用到独立作用域级的局部变量,C#为每个作用域创建一个private内部类。比如,假设scope 1有局部变量iTemp,而scope 2,是scope 1的嵌套作用域,有一个局部变量jTemp。让在使用来自scope 1 和 scope 2局部变量iTemp 和 jTemp的 scope 2中,我们定义一个匿名方法。下面的代码显示了上面描述的示例:

public class Program
{
 public delegate void MyDelegate();
 public static void Main(string[] args)
 {
  MyDelegate dlg = null;
  int iTemp = 100;
  if (iTemp > 50)
  {
   int jTemp = 200;
   dlg = delegate
   {
    Console.WriteLine("iTemp: {0}, jTemp: {1}",iTemp,jTemp);
   };
  }
  dlg();
 }
}

  当上面的代码被编译时,C#编译器在''Program''类中创建两个内部类。一个内部类包装局部变量iTemp作为一个public数据成员。第二个内部类包装在嵌套作用域中的局部变量,jTemp,作为一个public数据成员,同时在相同的嵌套作用域中包装匿名方法作为public实例方法。C#编译器为上面的代码生成下面的伪代码:

public class Program
{
 //包装来自外部作用域的局部变量''iTemp''的类
 private class InnerClassScope1
 {
  public int iTemp;
 }
 //包装来自内部作用域和匿名方法的局部变量的类
 private class InnerClassScope2
 {
  public void InstanceMethod()
  {
   Console.WriteLine("iTemp: {0}, jTemp: {1}", localObjectScope1.iTemp, jTemp);
  }
  public InnerClassScope1 localObjectScope1;
  public int jTemp;
 }
 public delegate void MyDelegate();
 public static void Main(string[] args)
 {
  MyDelegate dlg = null;
  InnerClassScope1 localObject1 = new InnerClassScope1();
  localObject1.iTemp = 100;
  if (localObject1.iTemp > 50)
  {
   InnerClassScope2 localObject2 = new InnerClassScope2();
   localObject2.localObjectScope1 = localObject1;
   localObject2.jTemp = 200;
   dlg = new MyDelegate(localObject2.InstanceMethod);
  }
  dlg();
 }
}

  正如上面的代码所示,包装匿名方法的内部类将拥有所有代表外部作用域局部变量的对象,这些变量被用在匿名方法中,像public数据成员。下图显示了C#默默创建的内部类的ILDASM视图:

04h89bm20yur.jpg

转载于:https://www.cnblogs.com/zgqys1980/archive/2007/06/20/790024.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值