事件就是封装的委托.
声明委托的语法:
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
代码很好懂,但不知道具体应用场景。