委托揭秘
2009-06-10 08:32:08 来源:WEB开发网核心提示: aMyDelegate(); 将生成一下代码,好像源代码本来就是这么写的一样:aMyDelegate.Invoke(); 为了验证编译器生成代码来调用委托的 Invoke 方法,委托揭秘(5),我们可以用 ILDasm.exe 来检查为voidMethod(MyDelegateaMyD
aMyDelegate();
将生成一下代码,好像源代码本来就是这么写的一样:
aMyDelegate.Invoke();
为了验证编译器生成代码来调用委托的 Invoke 方法,我们可以用 ILDasm.exe 来检查为 void Method(MyDelegate aMyDelegate) 方法创建的IL代码。图1-2 展示了 void Method(MyDelegate aMyDelegate) 方法的中间语言(intermediate language,IL)代码。
图片看不清楚?请点击这里查看原图(大图)。
图1-2 ILDasm.exe 证明编译器生成了对 MyDelegate 委托类型的 Invoke 方法的调用
事实上,我们可以修改 void Method(MyDelegate aMyDelegate) 方法来显示调用 Invoke,如下所以:
private void Method(MyDelegate aMyDelegate)
{
if (aMyDelegate != null)
{
aMyDelegate.Invoke();
}
}
我们还记得编译器在定义 MyDelegate 类的时候定义 Invoke 的。所以在调用 Invoke 的时候,它使用的是 private _target 和 _methodPtr 字段来对指定对象调用所需的方法。注意,Invoke 方法的签名匹配委托的签名,因为 MyDelegate 委托是一个无参数并返回类型为 void,Invoke 方法(如编译器生成的那样)也是一个无参数并返回 void。
End.
更多精彩
赞助商链接