[C#]自作クラスへのカスタムイベント追加メモ。

自作クラスへカスタムイベントを実装する方法のメモ。

自作クラスが保持するある変数の値の変更前・変更後の通知を行うカスタムイベントを実装してみる。

今回もインターネッツのサイト様を参考。
C# 入門 & 実践 / C sharp - 4-27. イベント – 1 – イベントの発生 / イベントの実装

1秒周期で値を変更するイベントの例。

マイイベントクラス(MyEventClass)

    /// <summary>
    /// マイイベントクラス
    /// </summary>
    class MyEventClass
    {
        /// <summary>
        /// 内部で値を保持する
        /// </summary>
        private int? _val = null;

        /// <summary>
        /// プライベート変数へのアクセッサ
        /// </summary>
        public int? VAL
        {
            get
            {
                return _val;
            }

            private set
            {
                bool change = _val != value;
                if (change) OnChangingHandler(new EventArgs());
                _val = value;
                if (change) OnChangedHandler(new EventArgs());
            }
        }

        /// <summary>
        /// 値変更前イベント
        /// </summary>
        public EventHandler OnChangingValue;


        /// <summary>
        /// 値変更後イベント
        /// </summary>
        public EventHandler OnChangedValue;

        /// <summary>
        /// 値変更前イベントハンドラ
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnChangingHandler(EventArgs e)
        {
            if (OnChangingValue != null)
            {
                OnChangingValue(this, e);
            }
        }

        /// <summary>
        /// 値変更後イベントハンドラ
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnChangedHandler(EventArgs e)
        {
            if (OnChangedValue != null)
            {
                OnChangedValue(this, e);
            }
        }

        /// <summary>
        /// 値変更
        /// </summary>
        /// <param name="i"></param>
        public void SetData(int? i)
        {
            VAL = i;
        }

        /// <summary>
        /// 定周期値変更イベント開始
        /// </summary>
        public void Start()
        {
            var task = Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    System.Threading.Thread.Sleep(1000);

                    /// ここで値を変更する
                    if (VAL == null) SetData(0);
                    else SetData(VAL + 1);
                }
            });

        }
    }

テストForm

    public partial class Form1 : Form
    {
        private MyEventClass _evt = new MyEventClass();

        public Form1()
        {
            InitializeComponent();

            /// 値変更前通知イベント
            _evt.OnChangingValue += (s, e) =>
                {
                    this.Invoke(new Action(() => label1.Text = "OnChangingValue : " + _evt.VAL.ToString()));
                };

            /// 値変更後通知イベント
            _evt.OnChangedValue += (s, e) =>
            {
                this.Invoke(new Action(() => label2.Text = "OnChangedValue : " + _evt.VAL.ToString()));
            };
        }

        /// <summary>
        /// タイマー開始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            /// 定周期タイマー開始
            _evt.Start();
        }

        /// <summary>
        /// 値 = 0
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            _evt.SetData(0);
        }
    }

実行画面

今回作成したソースはこちら