C# 代理 delegate +=的本质

C# 代理或事件中会使用到+=方法注册事件,通过IL查看其本质是使用了System.Delegate.Combine方法

SayDele += new SaySomeDele(SayhelloMethod);
 SayDele += new SaySomeDele(sayFuckMethod);
//SayDele = (SaySomeDele)System.Delegate.Combine(new SaySomeDele(SayhelloMethod), SayDele);
//SayDele = (SaySomeDele)System.Delegate.Combine(new SaySomeDele(sayFuckMethod), SayDele);
SayDele("someOne ");



            .method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       88 (0x58)
  .maxstack  4
  IL_0000:  nop
  IL_0001:  ldsfld     class T.JiaDengLearn.SaySomeDele T.JiaDengLearn.Program::SayDele
  IL_0006:  ldnull
  IL_0007:  ldftn      void T.JiaDengLearn.Program::SayhelloMethod(string)
  IL_000d:  newobj     instance void T.JiaDengLearn.SaySomeDele::.ctor(object,
                                                                       native int)
  IL_0012:  call       class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate,
                                                                                          class [mscorlib]System.Delegate)
  IL_0017:  castclass  T.JiaDengLearn.SaySomeDele
  IL_001c:  stsfld     class T.JiaDengLearn.SaySomeDele T.JiaDengLearn.Program::SayDele
  IL_0021:  ldsfld     class T.JiaDengLearn.SaySomeDele T.JiaDengLearn.Program::SayDele
  IL_0026:  ldnull
  IL_0027:  ldftn      void T.JiaDengLearn.Program::sayFuckMethod(string)
  IL_002d:  newobj     instance void T.JiaDengLearn.SaySomeDele::.ctor(object,
                                                                       native int)
  IL_0032:  call       class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate,
                                                                                          class [mscorlib]System.Delegate)

  IL_0037:  castclass  T.JiaDengLearn.SaySomeDele
  IL_003c:  stsfld     class T.JiaDengLearn.SaySomeDele T.JiaDengLearn.Program::SayDele
  IL_0041:  ldsfld     class T.JiaDengLearn.SaySomeDele T.JiaDengLearn.Program::SayDele
  IL_0046:  ldstr      "someOne "
  IL_004b:  callvirt   instance void T.JiaDengLearn.SaySomeDele::Invoke(string)
  IL_0050:  nop
  IL_0051:  call       int32 [mscorlib]System.Console::Read()
  IL_0056:  pop
  IL_0057:  ret
} // end of method Program::Main

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值