委托變量 delegate1 與普通 string 變量無異。但封裝原則要求:該公開則公開,該私有則私有。
若聲明 private:客戶端不可見,無法註冊方法,失去意義。
若聲明 public:客戶端可任意賦值 (=) 破壞封裝,甚至覆蓋已註冊方法。
語法不一致:首次註冊用 = (賦值),後續用 += (組合),語義卻相同。
若 delegate1 是 string,自然會用屬性封裝。Event 由此登場:它封裝委托變量,使得:
public/protected,實際為 private+=/-=,存取級別同事件聲明修飾符改寫 GreetingManager:
public class GreetingManager {
public event GreetingDelegate MakeGreet;
public void GreetPeople(string name) { MakeGreet(name); }
}
唯一差別多了 event 關鍵字。客戶端調用:
static void Main() {
GreetingManager gm = new GreetingManager();
gm.MakeGreet = EnglishGreeting; // 編譯錯誤:事件只能出現在 +=/-= 左側
gm.MakeGreet += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang");
}
用 Reflector 檢視發現:public event 編譯為 private 欄位,故外部不可直接賦值。