[C#] 事件(event)
阿新 • • 發佈:2019-01-08
事件就是封裝的委託.
宣告委託的語法:
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
程式碼很好懂,但不知道具體應用場景。