C# delegate.Invoke如何工作?
如果我在代码中创建一个委托,如:C# delegate.Invoke如何工作?,c#,.net,delegates,invoke,C#,.net,Delegates,Invoke,如果我在代码中创建一个委托,如: delegate void dostuff (string o); 这将生成一个派生自System.MulticastDelegate的类,该类实现了三种方法—调用、开始调用和结束调用 如果我查看Invoke的编译IL,我看到的是: .method public hidebysig newslot virtual instance void Invoke(string o) runtime managed { } // end of met
delegate void dostuff (string o);
这将生成一个派生自System.MulticastDelegate
的类,该类实现了三种方法—调用
、开始调用
和结束调用
如果我查看Invoke
的编译IL,我看到的是:
.method public hidebysig newslot virtual
instance void Invoke(string o) runtime managed
{
} // end of method dostuff::Invoke
该方法不包含任何代码。调用它确实有效——委托会被调用,但我看不出它是如何实现的
使调用实际调用委托的巫毒来自何处?可以在签名末尾找到巫毒:
运行时管理的。请注意,您定义的所有托管类和方法都将修饰为cli managed
运行时管理
意味着运行时提供了方法的预优化实现。它只是底层.Net框架的一部分——调用就是调用MyDelegate.Invoke()
与MyDelegate()
MyDelegate()相同,MyDelegate()只是一种语法糖,可以编译为MyDelegate.Invoke()——对生成的Invoke方法的调用。调用的IL只是callvirt实例void ConsoleApplication1.Program/dostuff::Invoke(string),它与任何其他方法调用都没有区别。委托确实具有行为。它在调用列表上循环-一个委托可以表示要调用的多个方法-并依次调用每个方法。我看不出实现方法如何重写该行为。这是一个有趣的模式,但我看不到任何证据表明它是这样工作的。但这对多播代理不起作用。当创建委托时,它肯定是生成的委托类被创建,它的构造函数被调用,方法被传递给它。这里没有巫毒,它只是像创建任何普通类一样创建生成的委托类。@Mongus,更新了我的答案。但是请注意,用于迭代调用列表的“行为”不是委托的一部分,而是System.delegate的一部分。@Mongus:至少从.NET 2.0.ah开始,所有委托都是多播的!所以这毕竟是巫毒!谢谢;)