[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

代码很好懂,但不知道具体应用场景。


http://www.tutorialsteacher.com/csharp/csharp-event

猜你喜欢

转载自blog.csdn.net/ftell/article/details/82532818