程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入解析C#編程中的事件(2)

深入解析C#編程中的事件(2)

編輯:關於C語言
一個形式為x += y 或 x -= y的操作中,當x是一個事件成員而引用在包含x的聲明的類型外面發生時,操作的結果就是void(在賦值後與x的數值相反)。這個規則禁止外部代碼直接檢查事件成員的基本代表。

下面的例子介紹了事件句柄如何附加到上面的類Button的實例中:

public class LoginDialog: Form
{
 Button OkButton;
 Button CancelButton;
 public LoginDialog() {
  OkButton = new Button(...);
  OkButton.Click += new EventHandler(OkButtonClick);
  CancelButton = new Button(...);
  CancelButton.Click += new EventHandler(CancelButtonClick);
 }
 void OkButtonClick(object sender, Event e) {
  // Handle OkButton.Click event
 }
 void CancelButtonClick(object sender, Event e) {
  // Handle CancelButton.Click event
 }
}

這裡,構造函數LoginDialog創建了兩個Button實例,並且把事件句柄附加到事件Click中。

事件成員是典型域,就像上面的Button例子中所示。在每個事件消耗一個域存儲的情況是不可接受的,一個類可以聲明事件屬性來替代事件域,並且使用私有機制來存儲基本的代表。(設想在某種情況下,大多數事件都是未處理的,每個事件使用一個域就不能被接受。使用屬性而不是域的能力允許開發人員在空間和時間上面取得一個折中方案。)

在例子中

class Control: Component
{
 // Unique keys for events
 static readonly object mouseDownEventKey = new object();
 static readonly object mouseUpEventKey = new object();
 // Return event handler associated with key
 protected Delegate GetEventHandler(object key) {...}
 // Set event handler associated with key
 protected void SetEventHandler(object key, Delegate handler) {...}
 // MouseDown event property
 public event MouseEventHandler MouseDown {
  get {
   return (MouseEventHandler)GetEventHandler(mouseDownEventKey);
  }
  set {
   SetEventHandler(mouseDownEventKey, value);
  }
 }
 // MouseUp event property
 public event MouseEventHandler MouseUp {
  get {
   return (MouseEventHandler)GetEventHandler(mouseUpEventKey);
  }
  set {
   SetEventHandler(mouseUpEventKey, value);
  }
}
}

類Control為事件提供了一種內部存儲機制。方法SetEventHandler用一個key來與代表數值相關,而方法GetEventHandler返回與key相關的當前代表。大概基本的存儲機制是按照把空代表類型與key相關不會有消耗而設計的,因此無句柄的事件不占用存儲空間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved