C 事件 委託 教程

2021-04-02 23:51:35 字數 3708 閱讀 6825

c# 中的「事件」是當物件發生某些有趣的事情時,類向該類的客戶提供通知的一種方法。事件最常見的用途是用於圖形使用者介面;通常,表示介面中的控制項的類具有一些事件,當使用者對控制項進行某些操作(如單擊某個按鈕)時,將通知這些事件。

但是事件未必只用於圖形介面。事件為物件提供一種通常很有用的方法來發出訊號表示狀態更改,這些狀態更改可能對該物件的客戶很有用。事件是建立類的重要構造塊,這些類可在大量的不同程式中重複使用。

使用委託來宣告事件。如果您尚未學習「委託教程」,您應先學習它,然後再繼續。請回憶委託物件封裝乙個方法,以便可以匿名呼叫該方法。事件是類允許客戶為其提供方法(事件發生時應呼叫這些方法)的委託的一種方法。事件發生時,將呼叫其客戶提供給它的委託。

除宣告事件、呼叫事件和與事件掛鉤的示例以外,本教程還介紹下列主題:

事件和繼承

介面中的事件

.net framework 指南

示例 1

下面的簡單示例展示乙個 listwithchangedevent 類,該類類似於標準的 arraylist 類,而且,每當列表內容更改時,該類均呼叫 changed 事件。這樣乙個通用用途的類可在大型程式中以多種方式使用。

例如,某字處理器可能包含開啟的文件的列表。每當該列表更改時,可能需要通知字處理器中的許多不同物件,以便能夠更新使用者介面。使用事件,維護文件列表的**不需要知道需要通知誰,一旦文件列表發生了更改,將自動呼叫該事件,正確通知每個需要通知的物件。使用事件提高了程式的模組化程度。

// events1.cs

using system;

namespace mycollections

// override some of the methods that can change the list;

// invoke event after each

public override int add(object value)

public override void clear()

public override object this[int index] }}

}namespace testevents

// this will be called whenever the list changes.

private void listchanged(object sender, eventargs e)

public void detach()

}class test }}

輸出this is called when the event fires.

this is called when the event fires.

**討論

宣告事件   若要在類內宣告事件,首先必須宣告該事件的委託型別(如果尚未宣告的話)。

public delegate void changedeventhandler(object sender, eventargs e);

委託型別定義傳遞給處理該事件的方法的一組引數。多個事件可共享相同的委託型別,因此僅當尚未宣告任何合適的委託型別時才需要執行該步驟。

接下來,宣告事件本身。

public event changedeventhandler changed;

宣告事件的方法與宣告委託型別的字段類似,只是關鍵字 event 在事件宣告前面,在修飾符後面。事件通常被宣告為公共事件,但允許任意可訪問修飾符。

呼叫事件   類宣告了事件以後,可以就像處理所指示的委託型別的字段那樣處理該事件。如果沒有任何客戶將委託與該事件掛鉤,該字段將為空;否則該欄位引用應在呼叫該事件時呼叫的委託。因此,呼叫事件時通常先檢查是否為空,然後再呼叫事件。

if (changed != null)

changed(this, e);

呼叫事件只能從宣告該事件的類內進行。

與事件掛鉤   從宣告事件的類外看,事件像個字段,但對該字段的訪問是非常受限制的。只可進行如下操作:

在該字段上撰寫新的委託。

從欄位(可能是復合字段)移除委託。

使用 += 和 -= 運算子完成此操作。為開始接收事件呼叫,客戶**先建立事件型別的委託,該委託引用應從事件呼叫的方法。然後它使用 += 將該委託寫到事件可能連線到的其他任何委託上。

// add "listchanged" to the changed event on "list":

list.changed += new changedeventhandler(listchanged);

當客戶**完成接收事件呼叫後,它將使用運算子 -= 從事件移除其委託。

// detach the event and delete the list:

list.changed -= new changedeventhandler(listchanged);

事件和繼承

當建立可以從中派生的通用元件時,事件中有時出現似乎會成為問題的情況。由於事件只能從宣告它們的類中呼叫,因此派生類不能直接呼叫在基類內宣告的事件。雖然這有時符合需要,但通常使派生類能夠自由呼叫事件更合適。這通常通過為事件建立受保護的呼叫方法來實現。通過呼叫該呼叫方法,派生類便可以呼叫此事件。為獲得更大的靈活性,呼叫方法通常宣告為虛擬的,這允許派生類重寫呼叫方法。這使得派生類可以截獲基類正在呼叫的事件,有可能對這些事件執行它自己的處理。

在前面的示例中,這已用 onchanged 方法實現。如果需要,派生類可呼叫或重寫該方法。

介面中的事件

事件和字段之間的另乙個差異是,事件可放在介面中,而字段不能。當實現介面時,實現類必須在實現介面的類中提供相應的事件。

.net framework 指南

儘管 c# 語言允許事件使用任意委託型別,但「.net framework」對於應為事件使用的委託型別有一些更嚴格的指南。如果打算將您的元件與「.net framework」一起使用,您可能希望遵守這些指南。

「.net framework」指南指示用於事件的委託型別應採用兩個引數:指示事件源的「物件源」引數和封裝事件的其他任何相關資訊的「e」引數。「e」引數的型別應從 eventargs 類派生。對於不使用其他任何資訊的事件,「.net framework」已定義了乙個適當的委託型別:eventhandler。

示例 2

下面的示例是「示例 1」的修改版本,它遵守「.net framework」指南。該示例使用 eventhandler 委託型別。

// events2.cs

using system;

namespace mycollections

// override some of the methods that can change the list;

// invoke event after each:

public override int add(object value)

public override void clear()

public override object this[int index] }}

}namespace testevents

// this will be called whenever the list changes:

private void listchanged(object sender, eventargs e)

public void detach()

}class test }}

輸出this is called when the event fires.

this is called when the event fires.

c 事件 委託

c 事件 假設場景 在比賽過程中,當裁判員槍聲響起,發生了乙個事件,裁判員通知該事件發生,參加比賽的運動員仔細聽槍聲是否發生。運動員是該事件的訂閱者,沒有參賽的人不會注意,即沒有訂閱該事件。c 中使用事件需要的步驟 1 建立乙個事件 event 委託名 事件 2 訂閱事件 事件 new 委託名 方法...

c 事件委託

c 使用委託模型 來實現事件,事件的處理方法不必在將生成事件的類中定義,需要做的事情就是把事件源和事件處理程式結合起來,使用事件處理委託,簡稱事件委託可以定義為生成事件的類的乙個成員,事件委託為多播的。事件委託的形式 public delegate void mousehandler object ...

c 委託和委託事件

委託很好用,c 的委託有點函式指標的感覺,它能簡化判斷語句的使用,還能為視窗新增新的事件。weituo.cs using system using system.collections.generic using system.linq using system.text namespace fen...