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