為了驗證編譯器生成代碼來調用委托的 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.