LoginSignup
3
4

More than 1 year has passed since last update.

C# の Invoke, delegate の話の抽象化

Posted at

どうしても C# の Invoke, delegate の解説記事がうまく理解できないので、ゆっくり咀嚼しつつ自分なりの抽象化を試します。
ちゃんと C# を勉強しないまま使わざるを得ないので、試行錯誤の過程でこういうことになるのです...

delegate とは

関数ポインタ型 のようなもの
なので実体を作らないと使えない。
実体を作るときのコンストラクタには、実行したい関数のポインタを指定する。(つまり関数名を書く)

delegate の宣言の形は
delegate 実行したい関数の戻り値型 デリゲートの名前( 実行したい関数と同じ引数 )
という感じ。ただ戻り値がどこに戻るのかよくわからない。つまり受け取り方がよくわからない。むむむ。後で勉強しよう。

Invoke とは

関数ポインタを別スレッドに投げること。
コントロールのメソッドである Invoke は、そのコントロールの属するスレッドで投げられた関数を実行する。

引数には
1. デリゲートの実体
1. 実行したい関数への引数

を渡す。実行したい関数への引数がややこしいが、複数個の引数を羅列した object 配列を塊として渡す。
塊の作り方は

new object[]{ param1, param2, ...}

雛形

delegate void DELEGATENAME( T1 param1, T2 param2 );
void FUNCTIONNAME( T1 param1, T2 param2 )
{
}


// 別のスレッドで実行されている関数
void OTHER_THREAD_FUNCTION()
{

  DELEGATENAME dINSTANCE = new DELEGATENAME( FUNCTIONNAME );
  oneObject.Invoke( dINSTANCE, new object[]{ param1, param2 } );

}

こんなところでしょうか。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4