当在代码中使用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完成的
。
打印 | 张贴于 2004-03-07 23:16:00 | Tag:学习
留言反馈