2011-06-17 4 views
10

は: - InvokeBeginInvokeEndInvokedelegate.Invokeはどのように機能しますか?私のような私のコードにデリゲートを作成する場合

delegate void dostuff (string o); 

これは、3つのメソッドを実装しSystem.MulticastDelegateから派生するクラスを生成します。

私はInvoke用にコンパイルされたILを見れば、私が見るすべては次のとおりです。

.method public hidebysig newslot virtual 
     instance void Invoke(string o) runtime managed 
{ 
} // end of method dostuff::Invoke 

メソッドは、コードが含まれていません。それを呼び出すことは機能します - デリゲートが呼び出されますが、どのようにそれを行うのか分かりません。

Invokeを呼び出すブードゥーは実際にデリゲートを呼び出すのですか?

+0

これは基本的な.Netフレームワークの一部です。*呼び出しは*呼び出す呼び出しです。 MyDelegate.Invoke()は、MyDelegate()と同じです。 –

+0

MyDelegate()は、MyDelegate.Invoke()にコンパイルされた構文砂糖で、生成されたInvokeメソッドを呼び出します。コールのILは、単に* callvirtインスタンスvoid ConsoleApplication1.Program/dostuff :: Invoke(string)*であり、他のメソッド呼び出しと変わりません。 –

答えて

7

ブードーは、署名の最後にあります:runtime managedです。定義したすべてのマネージクラスとメソッドは、cli managedと装飾されていることに注意してください。

runtime managedは、ランタイムがメソッドの事前に最適化された実装を提供することを意味します。

+0

デリゲートには動作があります。その呼び出しリストをループします。デリゲートは呼び出す複数のメソッドを表すことができ、順番に各メソッドを呼び出します。 –

+0

実装方法が動作をどのように上書きできるかはわかりません。それは興味深いパターンですが、私はこれが動作する方法の証拠を見ることができません。しかし、マルチキャストの代理人にとってはうまくいかないでしょう。デリゲートを作成するときは、生成されたデリゲートクラスが生成され、そのコンストラクターが渡されたメソッドで呼び出されることは間違いありません。ここにブードーはありません。通常のクラスが作成されたのと同じように、生成されたデリゲートクラスを作成するだけです。 –

+0

@Mongus、私の答えを更新しました。ただし、呼び出しリストを反復処理するための「振る舞い」はDelegateの一部ではなく、System.Delegateの一部です。 –

関連する問題