對事件與委託的理解 2 引發事件

2021-03-31 08:56:30 字數 4113 閱讀 9163

事件功能是由三個互相聯絡的元素提供的:提供事件資料的類、事件委託和引發事件的類。.*** framework 具有命名與事件相關的類和方法的約定。如果想要您的類引發乙個名為 eventname 的事件,您需要以下元素。

.*** framework 類庫或第三方類庫中可能已經定義了事件資料類和事件委託類。在這種情況下,您就不需要定義這些類了。

提供事件功能

定義乙個提供事件資料的類。該類必須從 system.eventargs(它是事件資料的基類)匯出。示例如下。

注意   如果已存在事件的事件資料類,或者沒有與您的事件關聯的資料,則不需要該步驟。如果沒有事件資料,請使用基類 system.eventargs。

[c#]

public class alarmeventargs : eventargs

public int numrings

public bool snoozepressed

...}

[visual basic]

public class alarmeventargs

inherits eventargs

private nrings as integer = 0

private _snoozepressed as boolean = false

'properties.

public readonly property alarmtext() as string

...end property

public readonly property numrings() as integer

...end property

public readonly property snoozepressed() as boolean

...end property

...end class

宣告事件的委託,如下面的示例所示。

注意   如果事件不生成資料,您不需要宣告自定義委託。在這種情況下,請使用基事件處理程式 system.***ponentmodel.eventhandler。

[c#]

public delegate void alarmeventhandler(object sender, alarmeventargs e);

[visual basic]

public delegate sub alarmeventhandler(sender as object, e as alarmeventargs)

使用 event 關鍵字(其型別是事件委託)在您的類中定義乙個公共事件成員,如下面的示例所示。

[c#]

public class alarmclock

[visual basic]

public class alarmclock

...public event alarm as alarmeventhandler

end class

在 alarmclock 類中,alarm 事件是 alarmeventhandler 型別的委託。當編譯器遇到 event 關鍵字時,它建立乙個私有成員,例如

[c#]

private alarmeventhandler al = null;

以及 add_alarm 和 remove_alarm 這兩個公共方法。這些方法是事件掛鉤,它們允許委託和事件委託 al 合併或從事件委託 al 移除。這些細節對程式設計師是隱藏的。

注意   在除 c# 和 visual basic .*** 以外的其他語言中,編譯器可能不自動生成與事件成員對應的**,您可能需要顯式地定義事件掛鉤和私有委託字段。

在引發事件的類中提供乙個受保護的方法。該方法的名稱必須是 oneventname。oneventname 方法通過呼叫委託來引發事件。本主題最後的**示例顯示了 oneventname 的實現。

注意   受保護的 oneventname 方法也允許派生類重寫事件,而不必向其附加委託。派生類必須始終呼叫基類的 oneventname 方法以確保註冊的委託接收到事件。

[c#]

public class alarmclock

}[visual basic]

public class alarmclock

...public event alarm as alarmeventhandler

protected overridable sub onalarm(e as alarmeventargs)

...end sub

end class

下面的**片段將本節中討論的所有元素放到了一起。有關實現和使用事件的完整示例,請參見事件示例。

[c#]

//step 1. class that defines data for the event

//public class alarmeventargs : eventargs

// properties.

public int numrings}

public bool snoozepressed }   

public string alarmtext }

}//step 2. delegate declaration.

//public delegate void alarmeventhandler(object sender, alarmeventargs e);

// class definition.

//public class alarmclock }}

[visual basic]

'step 1. class that defines data for the event

'public class alarmeventargs

inherits eventargs

private _snoozepressed as boolean = false

private nrings as integer = 0

' constructor.

public sub new(snoozepressed as boolean, nrings as integer)

...end sub

' properties.

public readonly property numrings() as integer

getreturn nrings

end get

end property

public readonly property snoozepressed() as boolean

getreturn _snoozepressed

end get

end property

public readonly property alarmtext() as string

get...

end get

end property

end class

'step 2. delegate declaration.

'public delegate sub alarmeventhandler(sender as object, e as alarmeventargs)

' class definition.

'public class alarmclock

'step 3. the alarm event is defined using the event keyword.

'the type of alarm is alarmeventhandler.

public event alarm as alarmeventhandler

''step 4. the protected onalarm method raises the event by invoking

'the delegates. the sender is always this, the current instance of

'the class.

'  

protected overridable sub onalarm(e as alarmeventargs)

'invokes the delegates.

raiseevent alarm(me, e)

end sub

end class

對事件的理解

事件類似於異常,因為它們都是由物件引發。訂閱乙個事件的含義是提供 在事件發生時執行這些 它們稱為事件處理程式。事件處理程式本身都是簡單的函式。對事件處理函式的惟一限制是它必須匹配於事件所要求的簽名 返回型別和引數 這個簽名是事件定義的一部分,由乙個委託指定。要處理事件,需要提供乙個事件處理函式 該函...

iphone8引發的AR大事件

北京時間9月13日凌晨1點,在蘋果手機面世10周年之際,蘋果2017年秋季新品發布會在美國加州庫比蒂諾市蘋果公司總部的史蒂夫 賈伯斯劇院舉行,發布了最新的蘋果旗艦手機,iphone8和iphonex。正如傳聞所言,取消home鍵,全面屏 面部識別 無線充電等功能都一一實現了。但在蘋果強大的效能上,更...

關於js中對事件繫結與普通事件的理解

普通事件指的是可以用來註冊的事件 事件繫結是指把事件註冊到具體的元素之上。通俗點說 普通事件 給html元素新增乙個特定的屬性 如 onclick 事件繫結 js 中通過標記 id tag class 獲取元素,給元素新增特定的方法 如 onclick 擴充套件 事件監聽addeventlisten...