匿名方法
匿名方法與具名方法在本質上是相同的,使用匿名方法後編譯器在定義匿名方法的類的外部動態產生具名方法。
/// <summary>
/// 定義委託
/// </summary>
delegate void DoWorkDelegate();
class Program
{
static void Main(string[] args)
{
//具名方法的委託
DoWorkDelegate doWorkName=new DoWorkDelegate (DoWorkWithName);
//匿名方法的委託
DoWorkDelegate doWorkNoName=delegate()
{
Console.WriteLine("DoWorkDelegate AnonymousDelegate");
};
Console.Read();
}
/// <summary>
/// 具名方法
/// </summary>
static void DoWorkWithName()
{
Console.WriteLine("DoWorkDelegate AnonymousDelegate");
}
}
使用ildasm開啟程式集後可以看到:
Program下有兩個靜態方法
.method private hidebysig static void DoWorkWithName() cil managed
{
// 代碼大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "DoWorkDelegate AnonymousDelegate"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::DoWorkWithName
'<Main>b__0' 為編譯器在後台為匿名方法產生的靜態方法
.method private hidebysig static void '<Main>b__0'() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// 代碼大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "DoWorkDelegate AnonymousDelegate"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::'<Main>b__0'
委託初始化產生的IL代碼如下:
委託使用具名方法執行個體化:
IL_0002: ldftn void AnonymousDelegateApp.Program::DoWorkWithName()
IL_0008: newobj instance void AnonymousDelegateApp.DoWorkDelegate::.ctor(object,
native int)
委託使用匿名方法執行個體化:
IL_0016: ldftn void AnonymousDelegateApp.Program::'<Main>b__0'()
IL_001c: newobj instance void AnonymousDelegateApp.DoWorkDelegate::.ctor(object,
native int)
由此可見匿名方法與具名方法本質上沒有任何區別,匿名方法只是編譯器在後台動態產生了具名方法,使用匿名方法或具名方法執行個體化委託時,
兩者產生的Il代碼是完全一致的。