#【c#心得记录】委托细节四#
反编译一下委托实例化的代码
// inputStrDelegate = delegate
// {
// Console.WriteLine("委托实例化:lambda表达式");
// };
IL_008e: ldsfld class [Library]Library.InputStrDelegate DelegateConsole.Program/'<>c'::'<>9__0_3'
// (no C# code)
IL_0093: dup
IL_0094: brtrue.s IL_00ad
IL_0096: pop
IL_0097: ldsfld class DelegateConsole.Program/'<>c' DelegateConsole.Program/'<>c'::'<>9'
IL_009c: ldftn instance void DelegateConsole.Program/'<>c'::'b__0_3'(string)
IL_00a2: newobj instance void [Library]Library.InputStrDelegate::.ctor(object, native int)
IL_00a7: dup
IL_00a8: stsfld class [Library]Library.InputStrDelegate DelegateConsole.Program/'<>c'::'<>9__0_3'
其实只是加载了对应的方法(相当于函数指针) 单独使用委托实例化与使用方法并没有区别
再反编译看一下委托多播(+=)
// InputStrDelegate a = Delegate.Combine(inputStrDelegate3, inputStrDelegate4) as InputStrDelegate;
IL_01a5: ldloc.s 5
IL_01a7: ldloc.s 6
IL_01a9: call class [System.Runtime]System.Delegate [System.Runtime]System
.Delegate::Combine(class [System.Runtime]System.Delegate, class [System.Runtime]System.Delegate)
IL_01ae: isinst [Library]Library.InputStrDelegate
IL_01b3: stloc.s 8
// a = (Delegate.Combine(a, b) as InputStrDelegate);
IL_01b5: ldloc.s 8
IL_01b7: ldloc.s 7
IL_01b9: call class [System.Runtime]System.Delegate [System.Runtime]System
.Delegate::Combine(class [System.Runtime]System.Delegate, class [System.Runtime]System.Delegate)
IL_01be: isinst [Library]Library.InputStrDelegate
IL_01c3: stloc.s 8
// a = (Delegate.Remove(a, inputStrDelegate4) as InputStrDelegate);
IL_01c5: ldloc.s 8
IL_01c7: ldloc.s 6
可以看到使用+=/-=时其实就是调用了Delegate的Combine与Remove方法
IL_01c9: call class [System.Runtime]System.Delegate [System.Runtime]System
.Delegate::Remove(class [System.Runtime]System.Delegate, class [System.Runtime]System.Delegate)
