1. 程式人生 > >[C#] 事件(event)

[C#] 事件(event)

事件就是封裝的委託.

宣告委託的語法:

public delegate void someEvent();
public someEvent someEvent;

宣告事件的語法,加關鍵字 event

public delegate void someEvent();
public event someEvent someEvent;

要點:

  • 宣告一個事件時,使用event關鍵字 + 委託型別
  • 引發事件前,先檢查事件是否為null
  • 使用 += 訂閱事件, 使用 -= 取消訂閱
  • 處理事件的函式稱為事件處理函式 (event handler),事件處理函式必須與宣告的事件委託具有相同的簽名。
  • 事件可以帶引數,將傳遞給處理函式。
  • 事件可宣告為static, virtual, sealed, 以及 abstract.
  • 事件可以是介面的成員。
  • 如果沒有訂閱者,事件不會被引發。
  • 如果有多個訂閱者,事件處理函式會被同時呼叫。
  • .NET framework 使用 EventHandler 委託 以及一個 EventArgs基類.

下面是例子:

事件 (Event) :

public class PrintHelper
{
    // 宣告委託 
    public delegate void BeforePrint();

    // 宣告型別為委託的事件
    public event BeforePrint beforePrintEvent;
// 建構函式 public PrintHelper() { } public void PrintNumber(int num) { //call delegate method before going to print if (beforePrintEvent != null) beforePrintEvent(); Console.WriteLine("Number: {0,-12:N0}", num); } public void PrintDecimal
(int dec) { if (beforePrintEvent != null) beforePrintEvent(); Console.WriteLine("Decimal: {0:G}", dec); } public void PrintMoney(int money) { if (beforePrintEvent != null) beforePrintEvent(); Console.WriteLine("Money: {0:C}", money); } public void PrintTemperature(int num) { if (beforePrintEvent != null) beforePrintEvent(); Console.WriteLine("Temperature: {0,4:N1} F", num); } public void PrintHexadecimal(int dec) { if (beforePrintEvent != null) beforePrintEvent(); Console.WriteLine("Hexadecimal: {0:X}", dec); } }

事件訂閱 (Event Subscriber) :

class Number
{
    private PrintHelper _printHelper;
    private int _value;
    
    public Number(int val)
    {
        _value = val;
        _printHelper = new PrintHelper();
        //subscribe to beforePrintEvent event
        _printHelper.beforePrintEvent += printHelper_beforePrintEvent;
    }
    
    //beforePrintevent handler
    void printHelper_beforePrintEvent()
    {
        Console.WriteLine("BeforPrintEventHandler: PrintHelper is going to print a value");
    }
    
    public int Value
    {
        get { return _value; }
        set { _value = value; }
    }

    public void PrintMoney()
    {
        _printHelper.PrintMoney(_value);
    }

    public void PrintNumber()
    {
        _printHelper.PrintNumber(_value);
    }
}

主類:

public class Program
{
    public static void Main()
	{
		Number myNumber = new Number(100000);
		myNumber.PrintMoney();
		myNumber.PrintNumber();
	}
}			

輸出:

BeforPrintEventHandler: PrintHelper is going to print a value
Money: $100,000.00
BeforPrintEventHandler: PrintHelper is going to print a value
Number: 100,000

程式碼很好懂,但不知道具體應用場景。