靜心學習—C# 事件Event(1)


關於“事件”的定義,請去問Google吧,本文不引用官方的術語。

廢話不多說,先定義一下場景:

微波爐,大家生活中都有用過,當你關上微波爐的門時便自動加熱。“關門”和“加熱”便是兩個動作。注意,當關上門的時候便開始加熱,這里“當關上門”便是一個“事件”的觸發條件。觸發了什么?“加熱”這個動作。

我相信你完全能理解我上面所說的內容吧?那么接下來我便一步一步來實現我的題目“C#事件Event”

第一步:定義我們的對象

對象一:微波爐

/// <summary>
    /// 微波爐
    /// </summary>
    class Microwave
    {

    }

對象二:加熱器(微波爐內置)

/// <summary>
    /// 加熱器
    /// </summary>
    class Heater
    {

    }

第二步:添加動作(或稱行為)

我們提過的,“關門” 和 “加熱” 兩個動作

/// <summary>
    /// 微波爐
    /// </summary>
    class Microwave
    {        
        /// <summary>
        /// 關門
        /// </summary>
        public void CloseDoor()
        {
            Console.WriteLine("Now the door is closed!");
        }
    }

    /// <summary>
    /// 加熱器
    /// </summary>
    class Heater
    {
        /// <summary>
        /// 加熱
        /// </summary>
        public void Heating()
        {
            Console.WriteLine("The food is heating!");
            Console.ReadLine();
        }
    }

第三步:定義我們的“事件”(出場)

    /// <summary>
    /// 微波爐
    /// </summary>
    class Microwave
    {        
public delegate void DoorCloseHandler(); public event DoorCloseHandler DoorCloseEvent; /// <summary> /// 關門 /// </summary> public void CloseDoor() { Console.WriteLine("Now the door is closed!"); } }

這里我們給“門”定義“關閉”事件,也就是下面那兩句:

public delegate void DoorCloseHandler();        
public event DoorCloseHandler DoorCloseEvent;

“事件”有了,什么時候執行呢?當然是“關上門”后執行了。

/// <summary>
    /// 微波爐
    /// </summary>
    class Microwave
    {        
        public delegate void DoorCloseHandler();        
        public event DoorCloseHandler DoorCloseEvent;

        /// <summary>
        /// 關門
        /// </summary>
        public void CloseDoor()
        {
            Console.WriteLine("Now the door is closed!");
            OnDoorClosed();
        }

        public void OnDoorClosed()
        {
            if (DoorCloseEvent != null)
                DoorCloseEvent();
        }
    }

看到了嗎?在我們之前定義的 CloseDoor 方法后面調用我們的“事件”。

到這里為止,我們知道了事件的“發起者”(關門動作),事件的“要做什么”(加熱),事件“什么時候執行”(關上門),還缺點什么呢?

串起來嘍,也就是俗稱的“綁定”它。

/// <summary>
    /// 微波爐
    /// </summary>
    class Microwave
    {        
        public delegate void DoorCloseHandler();        
        public event DoorCloseHandler DoorCloseEvent;

        /// <summary>
        /// 關門
        /// </summary>
        public void CloseDoor()
        {
            Console.WriteLine("Now the door is closed!");
            OnDoorClosed();
        }

        public void OnDoorClosed()
        {
            if (DoorCloseEvent != null)
                DoorCloseEvent();
        }

        public Microwave()
        {
            Heater heater = new Heater();
            this.DoorCloseEvent += heater.Heating;
        }
    }

我選擇了在廠家生產微波爐的時候就把他們綁起來(我是想說構造函數來着),不是這樣,我不會買這微波爐的,你呢?

大功告成,讓我們“關門”試試吧!

    class Program
    {
        static void Main(string[] args)
        {
            Microwave wave = new Microwave();
            wave.CloseDoor();
        }
    }

最后附上完整代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Event
{
    class Program
    {
        static void Main(string[] args)
        {
            Microwave wave = new Microwave();
            wave.CloseDoor();
        }
    }

    /// <summary>
    /// 微波爐
    /// </summary>
    class Microwave
    {        
        public delegate void DoorCloseHandler();        
        public event DoorCloseHandler DoorCloseEvent;

        /// <summary>
        /// 關門
        /// </summary>
        public void CloseDoor()
        {
            Console.WriteLine("Now the door is closed!");
            OnDoorClosed();
        }

        public void OnDoorClosed()
        {
            if (DoorCloseEvent != null)
                DoorCloseEvent();
        }

        public Microwave()
        {
            Heater heater = new Heater();
            this.DoorCloseEvent += heater.Heating;
        }
    }

    /// <summary>
    /// 加熱器
    /// </summary>
    class Heater
    {
        /// <summary>
        /// 加熱
        /// </summary>
        public void Heating()
        {
            Console.WriteLine("The food is heating!");
            Console.ReadLine();
        }
    }
}

希望能對你對事件的理解和使用有所幫助,謝謝!

開博之作,轉載麻煩注明原創作者,謝謝。期待下一篇吧:)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM