首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 22:用事件定義對外介面(二)

     編輯:關於C語言

正確引發事件的模式

AddMsg 方法展示恰當引發事件方法。暫存日誌處理常式變數很重要,確保多執行緒情況下日誌處理常式安全。若無此參考副本,使用者可能在 if 檢查與正式執行事件處理常式間移除事件處理常式。有副本則不會發生。

LoggerEventArgs 與編譯器產生的事件存取器

定義 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);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved