Win32のような低レベルのAPIには多くのコールバック関数があります。しかし、私はコールバック関数またはコールバックサブルーチンが何であるかについて混乱しています。C#のイベントはコールバック関数と見なされますか?
3 に答える
コールバック関数は、他の何かに渡される関数であり、後で関数を呼び出してユーザーに何かを通知します。これは、関数への参照を別の関数、たとえば関数ポインタのタイプに渡す方法が必要であることを意味します。.NETでは、デリゲートが使用されます。
イベントハンドラメソッドは、コールバック関数の例です。
.NETでは、デリゲートはWin32 APIタイプのコールバックに最も近いものですが、デリゲートの方がはるかに機能的です。イベント自体は、基礎となるデリゲートに基づいています。
Win32 APIでのコールバックの最も一般的な使用法は、リソースなどを列挙することです。たとえば、EnumChildWindows APIは、特定のウィンドウのすべての子ウィンドウの列挙を開始し、見つかった子ウィンドウごとにカスタムコールバックルーチンを呼び出します。そのコールバック内で、特定の子ウィンドウに関連する要件に関連するアクションを実行できます。たとえば、ウィンドウを列挙して、そのウィンドウに関連するカスタム基準に基づいて特定のウィンドウをプログラムで検索しようとしている場合があります。ウィンドウが見つかったらfalse
、コールバックから戻ることで列挙を強制的に終了できます。
.NETでは、コールバックを使用するこのパターンは必要ありません。これは、 IEnumerableインターフェイスを使用してより形式化されたソリューションを利用できるためです。
コールバックは継続の特定のケースです。PFPLを引用するには、30章:
[ファーストクラス]継続...は、計算で自由に受け渡しできる不定の存続期間を持つ通常の値です。継続が「期限切れ」になることはなく、安全性を損なうことなく継続を回復することは常に賢明です。したがって、継続は無制限の「タイムトラベル」をサポートします。計算の前のポイントに戻ってから、将来のあるポイントに自由に戻ることができます。
継続が役立つのはなぜですか?基本的に、これらは特定の時点での計算の制御状態の表現です。継続を使用して、プログラムの制御状態を「チェックポイント」し、データ構造に保存して、後で戻ることができます。
したがって、コールバックは継続のさらに別の例です。非同期イベント処理でのそれらの使用は、継続を介して実行をある状態に復元する機能に由来します。
継続は、第一級関数と高階関数を備えた言語で特に使いやすいです。
参考資料:プログラミング言語の実用的な基礎、Robert Harper、2011年。