摘要:当在代码中使用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......[
阅读全文]