Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# delegate.Invoke如何工作?_C#_.net_Delegates_Invoke - Fatal编程技术网

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开始,所有委托都是多播的!所以这毕竟是巫毒!谢谢;)