2011-01-21 5 views
8

私は次のように定義されているイベントのデリゲート持っている:私は非同期的にイベントを発生させるBeginInvokeの@objectパラメータに渡される内容は何ですか?

public delegate void CallbackDelegate(Data data); 
public event CallbackDelegate OnDataComplete; 

を:

IAsyncResult CallbackDelegate.BeginInvoke(Data data, AsyncCallback callback, object @object) 

// Raise the OnDataComplete event 
OnDataComplete.BeginInvoke(new Data(), null, null); 

はその後、BeginInvokeの署名は次のようになります私がBeginInvokeを参照したほとんどの例は、の@objectパラメータで呼び出されますしかし、私はそのパラメータの目的は何かを説明するドキュメントを見つけることができません。

このパラメータの目的は何ですか?私たちはそれを何のために使うことができますか?

答えて

8

あなたのメソッドの関連情報をコールバックに渡すことができるようになっています。 C#はラムダ式を持ち、デリゲートは状態を持つことができるので、時にはこれは役に立たず、nullを渡すこともできます。しかしそれはControl.Tagと少し似ており、便利な情報をコールバックに与えることができます。


更新:

それも存在する理由の起源は、のみなしクロージャで、関数ポインタを持っていた言語に戻ります。 (あなたは "closure"という言葉を探したいかもしれません...私はそれを非常に簡潔に説明することはできません)。Cでは、関数ポインタだけがあり、代理人ではありません。したがって、関数ポインタは状態を保持できません。コールバックを提供したときはいつでも、呼び出し先が追加ポインターを渡すことで助けられました。そのため、コールバックに必要なデータを渡すことができます。 .NETでは、これらはあまり必要ではありません(デリゲートにはTargetオブジェクトがあり、状態を保持できるため)が、便利な場合もあります。

+1

+1「Control.Tag」に変更すると便利です。 – Tergiver

8

あなたが望むものを何でも提供できます。 AsyncResultメソッドでは、IAsyncResult.AsyncStateを使用してこの値を取得できます。あなたのためにそこにあります。

関連する問題