AddMsg 方法展示恰當引發事件方法。暫存日誌處理常式變數很重要,確保多執行緒情況下日誌處理常式安全。若無此參考副本,使用者可能在 if 檢查與正式執行事件處理常式間移除事件處理常式。有副本則不會發生。
定義 LoggerEventArgs 保存事件與訊息優先級。委派定義事件處理常式簽名。Logger 內部事件欄位定義事件處理常式。編譯器視事件為公用欄位,為你添加 add/remove 運算。產生程式碼與手寫相同:
public class Logger
{
private AddMessageEventHandler _Log;
public event AddMessageEventHandler Log
{
add { _Log = _Log + value; }
remove { _Log = _Log - value; }
}
public void AddMsg(int priority, string msg)
{
AddMessageEventHandler l = _Log;
if (l != null) l(null, new LoggerEventArgs(priority, msg));
}
}
C# 編譯器建立 add/remove 運算存取事件。公用事件定義語言簡潔、易讀、易維護、更準確。在類別添加事件時,讓編譯器建立添加/移除屬性。有原則強制添加時,應手寫處理常式。
下列類別自動將所有訊息發送到標準錯誤裝置(主控台):
class ConsoleLogger
{
static ConsoleLogger() { logger.Log += new AddMessageEventHandler(Logger_Log); }
private static void Logger_Log(object sender, LoggerEventArgs msg)
{
Console.Error.WriteLine("{0}:\t{1}", msg.Priority.ToString(), msg.Message);
}
}