【c#心得记录】委托细节五

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2021-12-29

#【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)

成为第一个回答人

评论

登录后才可发表内容
  • 主题

    20

  • 帖子

    80

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.0849s Mem:2047Kb