C#

C# delegate(デリゲート)の基本的な使い方

投稿日:

デリゲート(delegate: 代表、委譲、委託)とは、メソッドを参照するための型です。
機能は、「ある処理を他のメソッドに丸投げするためのもの」です。

C/C++言語の勉強をしたことがある人には、 「デリゲートとは関数ポインターや関数オブジェクトを拡張したもの」 と言った方が分かりやすいかもしれません。
ですが、C言語の関数ポインターと違うのは、 インスタンスメソッドを参照したり、 複数のメソッドを同時に参照する事が出来ます。

 

デリゲートの基本

デリゲートを使用するためにはまず、デリゲート型を定義します。

 

これによりデリゲートも1つの型として扱われます。
また、デリゲート型は自動的に System.Delegate クラスの派生クラスになります。

デリゲート型の変数には、 デリゲートの定義時に指定した物と同じ戻り値と引数リストを持つメソッドを代入する事が出来ます。

 

単純な例

デリゲートで実行する処理を持つクラスを用意します。

 

デリゲートを宣言して、デリゲートによりコンソールに表示するだけのプログラムです。

 

実行するとコンソールウィンドウに"hoge"という文字列が表示されます。

 

マルチキャストデリゲート

デリゲートにはメソッドを参照し、 間接的なメソッド呼び出しを行う機能があり、+= 演算子を用いることで、複数のメソッドを代入する事が出来ます。
複数のメソッドを代入した状態で、デリゲート呼び出しを行うと、代入した全てのメソッドが呼び出されます。

先ほどのクラスと似たクラスを用意して、テストプログラムを作ってみます。

追加するクラス(TestClass2)

 

上記のクラスを追加して、先ほどのプログラムを変更してみます。

 

 

デリゲート変数'func'に2つのメソッドを登録しましたが、処理呼び出しは1か所しかありません。

ですが、このプログラムを実行すると、コンソールに"hoge"という文字列が表示され、メッセージボックスが表示され、そこに「メッセージ」というメッセージが表示されます。

これは、'func'というデリゲート変数にメソッドが2つ登録されているので、デリゲートを1度呼び出しただけで登録された2つのメソッドが実行されます。

 

非同期呼び出し

デリゲート呼び出しは非同期に行うことも出来ます。 通常、メソッドを呼び出すとメソッド内の処理が完了するまで呼び出し元には戻ってきません。 このような動作を「同期呼び出し」と呼びます。
これに対して「非同期呼び出し」とは、 メソッドを呼び出した瞬間に呼び出し元に処理が戻ってくるような呼び出しのことです。

このデリゲートの「非同期呼び出し」を行うときは、マルチキャストデリゲートは使用できませんのでご注意ください。

引き続き、さきほどのクラスを使ってプログラムを変えて作ります。

 

このプログラムを実行すると、

デリゲートによりメッセージボックスが表示され、そこに「メッセージ」というメッセージが表示された状態で、コンソールウィンドウに"ここは非同期で即座に実行されます"という文字列が表示されます。
「メッセージ」というメッセージボックスを閉じると、「こちらはデリゲートが終わったら実行されます」というメッセージボックスが表示されます(こちらはデリゲートの処理である最初のメッセージボックスが閉じてデリゲート処理が終了するまで実行されません)。

 

-C#
-, , , , , , ,

Copyright© プログラミングテクニック集キヤミー , 2020 All Rights Reserved.