事件類似於異常,因為它們都由物件引發。但是它們也有幾個重要的區別:其中最重要的區別就是沒有處理異常中try...catch類似的結構來處理事件,而是必須訂閱它們。訂閱乙個事件的含義是提供**,在事件發生時執行這些**,它們稱為事件處理程式。
事件處理程式本身都是簡單的函式。對事件處理函式的唯一限制是它必須匹配於事件所要求的簽名(返回型別和引數)。這個簽名是事件定義的一部分,由乙個委託指定。
處理過程:
首先,應用程式建立乙個可以引發事件的物件
。例如,假定應用程式是乙個即時資訊傳送應用程式,它建立的物件表示乙個遠端使用者的連線。當接收到通過該連線從遠端使用者傳送來的資訊時,這個連線物件會引發乙個事件。
接著,應用程式訂閱事件
。為此,即時訊息傳送應用程式將定義乙個函式,該函式可以與事件指定的委託型別一起使用,把這個函式的乙個引用傳送給事件,而事件的處理函式可以是另乙個物件的方法,假定是表示顯示裝置的物件,當接收到資訊時,該方法將顯示即時資訊。
引發事件後,就通知訂閱器
。當接收到通過連線物件傳送過來的即時訊息時,就呼叫顯示裝置上的事件處理方法。因為我們使用的是乙個標準方法,所以引發事件的物件可以通過引數傳送任何相關的資訊,這樣就大大增加了事件的通用性。
看下面這個例子:
using
system;
using
system.timers;
namespace
ch12ex01
private
static
void writechar(object sender, elapsedeventargs e)
}
}
用於引發事件的物件是
system.timers.timer
類的乙個例項。使用乙個時間段來初始化該物件,當使用start()方法啟動timer物件時,就引發一系列事件,根據指定的時間段來引發事件。
timer
物件有乙個elapsed事件,這個事件要求的事件處理程式簽名是system.timers. elapsedeventhandler委託型別,該委託是在.net framework中定義的標準委託之一,用於與下述簽名匹配的函式:
void
functionname(object sender, elapsedeventargs e)
下乙個任務是把這個處理程式與事件關聯起來——即訂閱它。可以使用+=運算子,給事件新增乙個處理程式,其形式是用事件處理程式方法初始化的乙個新委託例項:
mytimer.elapsed +=
new elapsedeventhandler(functionname)
下面是如何定義和使用自己的事件。
在定義事件前,必須先定乙個委託型別,以用於該事件,這個委託型別指定了事件處理方法必須遵循的簽名。
public
delegate
void messagehandler(string messagetext);
這個委託型別稱為messagehandler,是void函式的簽名,它有乙個string引數。使用這個引數可以把connection物件接收過來的即時訊息傳送給display物件。
定義了委託後(或者定位現有合適的委託),就可以把事件本身定義為connection類的乙個成員。
public
class connection
",message);
} }
這個方法匹配於委託型別方法的簽名(返回型別和引數),所以可以使用它響應
messagearrived
事件。
在進行如下定義後
connection myconnection =
new connection();
display mydisplay =
new display();
myconnection.messagearrived +=
new messagehandler(mydisplay.displaymessage);
我們就可以看出,為
myconnection
物件的messagearrived事件進行初始化時,因為messagearrived事件是用messagehandler**型別定義的(void返回值和string引數),而display類下的displaymessage方法的定義與這個委託型別方法的簽名一致,所以可以將這個事件引發後要執行的方法轉到這個方法上來。
下面是整個程式用到的源**:
connection
類using
system;
using
system.timers;
namespace
ch12ex02
public
void connect()
public
void disconnect()
private
void checkformessage(object source, elapsedeventargs e)
}
} }
display
類using
system;
namespace
ch12ex02
",message);
} }
}
class1
類using
system;
namespace
ch12ex02
}
}
學習FlexViewer(一) 事件和框架
上午做了關於flexviewer的講座,專案組決定下面繼續在flexviewer介面上拓展,因此我也有意通過部落格與大家分享。眾所周知,flexviewer是由esri公司推出的基於web的flex應用框架,開發人員通過配置檔案即可快速搭建乙個以地圖服務應用為目的的富網際網路應用。學習flexvie...
c 學習筆記十一
類 1 封裝 繼承多型 2 類的定義 class box 3 建構函式 示例 如下 class box 方法 double box value 預設的建構函式 如果沒有定義構造成器,編譯器會自動生成乙個 預設的初始化值 在定義有引數的構造成函式後,可以去掉預設的構 造器 在構造器中使用初始化列表 示...
c 學習筆記十一
類 1 封裝 繼承多型 2 類的定義 class box 3 建構函式 示例 如下 class box 方法 double box value 預設的建構函式 如果沒有定義構造成器,編譯器會自動生成乙個 預設的初始化值 在定義有引數的構造成函式後,可以去掉預設的構 造器 在構造器中使用初始化列表 示...