感悟生活

Life is like a box of chocolates. You never know what you're gonna get.
随笔 - 97, 评论 - 982, 引用 - 46

导航

工具

关于

标签

每月存档

广告



访客

 

当在代码中使用Anonymous Method时,编译器会在生成的IL代码中插入像__AnonymousMethod$00000000这样的匿名方法实体,然后在匿名方法调用处替换原来的code。

例如,下面这样的一段匿名方法调用:

            string result = keywordsPattern.Replace(content, delegate(Match match)

              {

                return MakeColorSpan(match.ToString(), keywordsColor) ;

              }) ;

 

其中的匿名方法原型是:

public delegate String RegexMatchEvaluator(Match match) ;

 

编译器在生成的IL代码中插入的匿名方法实体代码如下:

 

.method private hidebysig instance string
        __AnonymousMethod$00000000(class [System]System.Text.RegularExpressions.Match match) cil managed
{
  // Code size       23 (0x17)
  .maxstack  3
  .locals init ([0] string CS$00000003$00000000)
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  callvirt   instance string [System]System.Text.RegularExpressions.Capture::ToString()
  IL_0007:  ldarg.0
  IL_0008:  ldfld      string PainterEngine.CodeToHTML::keywordsColor
  IL_000d:  call       instance string PainterEngine.CodeToHTML::MakeColorSpan(string,
                                                                               string)
  IL_0012:  stloc.0
  IL_0013:  br.s       IL_0015
  IL_0015:  ldloc.0
  IL_0016:  ret
} // end of method CodeToHTML::__AnonymousMethod$00000000


 

而那段匿名方法调用的IL代码如下:

 

  IL_025f:  ldarg.0
  IL_0260:  ldfld      class [System]System.Text.RegularExpressions.Regex PainterEngine.CodeToHTML::keywordsPattern
  IL_0265:  ldarg.1
  IL_0266:  ldloc.s    __CachedAnonymousMethod$00000001
  IL_0268:  brtrue.s   IL_027a
  IL_026a:  ldarg.0
  IL_026b:  ldftn      instance string PainterEngine.CodeToHTML::__AnonymousMethod$00000000(class [System]System.Text.RegularExpressions.Match)
  IL_0271:  newobj     instance void [System]System.Text.RegularExpressions.MatchEvaluator::.ctor(object,
                                                                                                  native int)
  IL_0276:  stloc.s    __CachedAnonymousMethod$00000001
  IL_0278:  br.s       IL_027a
  IL_027a:  ldloc.s    __CachedAnonymousMethod$00000001
  IL_027c:  callvirt   instance string [System]System.Text.RegularExpressions.Regex::Replace(string,
                                                                                             class [System]System.Text.RegularExpressions.MatchEvaluator)
  IL_0281:  stloc.s    result


 

可以看出,调用匿名方法的IL代码与调用普通的方法没有太大区别,编译器使用__CachedAnonymousMethod$00000001这样的临时变量来为匿名方法传递参数和返回值。

 

上面这段代码使用的是.NET Framework SDK version 1.2.30703,ILDASM version 1.2.30703.27。这段代码我实际用在CodePainter中,上面的代码着色就是使用CodePainter完成的笑脸

相关文章

Loading...

打印 | 张贴于 2004-03-07 23:16:00 | Tag:学习

留言反馈

暂时没有留言纪录
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System