LoginSignup
5
5

More than 3 years have passed since last update.

C#のデリゲートとイベントハンドラがいまだによくわかんないので振り返り

Posted at

はじめに

はじめてQiitaに投稿します。
業務でたまにC#を触るのですが、デリゲートとイベントハンドラについて
よくわかっていなかったので振り返りをおこないました。

目次

  • デリゲートまとめ
  • デリゲートの用途
  • イベントハンドラまとめ
  • Windowsフォームアプリのイベントハンドラ

デリゲートまとめ

"int"や"string"等と同様、型のひとつです。
インスタンスを生成する際にメソッドを登録して使います。
"delegete"(=代表、委譲、委託)という英単語の意味のとおり、
使う側には処理の内容は書かずに別のクラスへ委譲できる役割を果たします。
使う側は引数と戻り値の定義のみ記載して実際の処理の内容は書きません。
ポイントとしては複数のメソッドが登録できることです。

下記のように宣言します。

delegatetest.cs
// delegate 戻り値定義 デリゲート名(引数定義)
delegate int AddDelegate(int a,int b);

上記例の場合「int型の引数を2つを受け取ってint型の戻り値を返すメソッド」
を代入できるデリゲート型を宣言したということになります。

宣言したデリゲート型は下記のように使います。

delegatetest.cs
delegate int AddDelegate(int a,int b);

class Program
{
   static void Main(string[] args)
    {
        // 宣言したデリゲート型インスタンスを生成
        // その際にメソッドを登録(Addメソッド)
        AddDelegate add = new AddDelegate(Add);
    }

   // 2つの整数の加算結果を返すメソッド
   static int Add(int a,int b)
    {
        return a + b;
    }
}

実行結果:3

デリゲートの用途

一見すると通常のメソッドと変わらないように思えますが、
デリゲートを使うことで処理を汎用化することができるみたいです。
https://ufcpp.net/study/csharp/sp_delegate.html

上記リンク先の「デリゲートの用途」を読んでみると、
実際に処理する側(Selectメソッド)はPredictデリゲート型で渡された
引数の内容(デリゲート変数に何のメソッドが入っているか)は興味がなく、
単純に引数に入っているメソッドから得られたアウトプットをもとに処理をすればいいだけになっています。

逆に処理を委譲する側も、「この結果がほしい」とリクエストをしています。
知りたいのは「10超か」なのか「5超15未満か」なのか、委譲先のふるまいをコントロールできます。

「委譲」と聞いて何もしないかのように勘違いしてしまいましたが、
実際は委譲する際にはどんなアウトプットがほしいかリクエストしています。

イベントハンドラまとめ

イベントハンドラとは、ボタン押下や画面が開いた・閉じた、等のイベント発生時におこなう処理のこと。
デリゲートを利用して実現している。

イベント発生側とイベント受取側で分けるなら、イベントハンドラはイベント受取側。

イベント受信開始(イ)

イベント発生

イベント送信

イベントハンドラが受信(イ)

委譲された処理を実施(イ)

(イ)がついている役割をイベントハンドラが担っていると理解しました。

ポイントとしてはイベントハンドラへのメソッドの追加・削除はクラス外からもできますが、
イベントハンドラの呼び出しは同クラス内からのみおこなえる、という制約があります。(event構文の役割)

Windowsフォームアプリのイベントハンドラ

私がイベントハンドラが何者なのかつかみ切れていない正体はこれだったみたいです。
WindowsフォームアプリケーションのコントロールをVisual Studioで描画すると、
イベントハンドラも自動生成されるのでイベントハンドラにメソッドを登録するくらいしかおこなっていません。
普段はフレームワークの中に入ってしまっているのであまり意識しませんが、
下記リンクではイベントハンドラを自作できるので内部の動きの理解に役立ちました。
https://ufcpp.net/study/csharp/sp_event.html

これも自動生成なので普段あまり気にしてません(気にしないようにしてました)が、
イベントハンドラの謎の引数(object sender, EventArgs e)の正体は下記リンクがわかりやすかったです。
https://qiita.com/Ich_wei_/items/1e5993c316f4a78fac79

おわりに

業務をとおしてたまにC#を触っているのですが、
パッケージ開発が主業務ではないというのもあり(言い訳)中途半端な理解のものが多いです。
デリゲートとイベントハンドラもVSの機能で自動生成させているのでよくわかってませんでした。
誤りやご指摘等あればいただけると大変ありがたいです。

参考URL

https://ufcpp.net/study/csharp/sp_delegate.html
https://ufcpp.net/study/csharp/sp_event.html
https://qiita.com/Ich_wei_/items/1e5993c316f4a78fac79

5
5
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
5
5