全体表示

[ リスト ]

【C#】イベント (Event) 基本編

イベント

* あるクラスで発生したイベントを、他のクラスに伝えるために使用

利用手順

[1] デリゲートの定義

* イベントに使うメソッドの引数と戻り値をつけたら、delegate キーワードを頭につけて、デリゲートの定義を行う。
* 一般的に、第一引数にイベントを発生させるクラス、第二引数にイベントに関する情報を渡す。
delegate void SampleDelegate(object sender, EventArgs e);

[2] イベントの宣言

 * public event キーワードを利用し、デリゲートへの参照を保持するフィールドを定義する
public event SampleDelegate SampleEvent;

[3] イベントの登録

 * イベントの登録は、+=演算子を使用してイベントフィールドに設定する
sampleObject.SampleEvent += anotherObject.SampleHandler;

[4] イベントの発生

 * イベントを発生させる場合は、イベントフィールドに対して引数を渡して呼び出す
 * 呼び出し時に、事前にイベントフィールドがnullでないことを確認する必要がある
if (SampleEvent != null)
{
 EventArgs e = new EventArgs();
 SampleEvent(this, e);
}

サンプル

* イベントハンドラ:さまざまなイベントが発生した際に処理されたメソッド

SampleEvent.cs (イベントを持つクラス)

using System;

namespace Test
{
    public class Sample
    {
        // [1] デリゲートの定義
        public delegate int SampleDelegate(object instance, EventArgs eventArgs);
        // [2] イベントの宣言
        public event SampleDelegate SampleEvent;

        public int Execute(int arg)
        {
            // [4] イベントの発生
            if (SampleEvent != null)
            {
                int value = SampleEvent(this, new EventArgs());

                return arg * value;
            }
        }
    }
}

Form1.cs (イベントを呼び出すメソッド)

private void button1_Click(object sender, EventArgs e)
{
    Sample sampleObject = new Sample();

    // [3] イベントの登録
    // メソッドをイベントハンドラに登録(デリゲートのインスタンスをイベントに追加)
    sampleObject.SampleEvent += Method100; 
    int result = sampleObject.Execute(10); // メソッドを実行
    this.label1.Text = "Result = " + result; // 出力

    sampleObject.SampleEvent -= Method100;

    sampleObject.SampleEvent += Method200; // メソッドをイベントハンドラに登録
    result = sampleObject.Execute(10); // メソッドを実行
    this.label2.Text = "Result = " + result; // 出力
}

public static int Method100(object instance, EventArgs eventArgs)
{
    Console.WriteLine("Method100を実行");
    return 100;
}

public static int Method200(object instance, EventArgs eventArgs)
{
    Console.WriteLine("Method200を実行");
    return 200;
}

参考資料

http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_017/csharp_abc01.html

イベントの引数について

System.EventArgs クラス

* イベントに関する情報を保持

参考資料

http://www.yo.rim.or.jp/~nag/cgi-bin/wiki.cgi?p=Visual+Studio.NET

メモ

* イベントをイベント ハンドラに関連付けるには...
  =>『デリゲートのインスタンスをイベントに追加』する。★まだしっくり感覚的に分かっていない

* デリゲートを削除しない限り、そのイベントが発生すると、
 常にイベント ハンドラが呼び出される

関連

イベント 基本編 は以下。
http://blogs.yahoo.co.jp/dk521123/21238987.html
イベント 応用編1 は以下。
http://blogs.yahoo.co.jp/dk521123/19567787.html
イベント 応用編2 は以下。
http://blogs.yahoo.co.jp/dk521123/22499830.html
デリゲート は以下。
http://blogs.yahoo.co.jp/dk521123/20916739.html

閉じる コメント(0)

コメント投稿
名前パスワードブログ
絵文字
×
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

閉じる トラックバック(0)

トラックバックされた記事

トラックバックされている記事がありません。

トラックバック先の記事

  • トラックバック先の記事がありません。

.

よしもとタレントがコンテストに挑戦
楽しい話題がいっぱい(Y! Suica)

プライバシーポリシー -  利用規約 -  ガイドライン -  順守事項 -  ヘルプ・お問い合わせ

Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事