天天看點

委托、匿名方法、事件學習小結

一、委托

委托:把方法傳遞給其他方法,這個方法可以是靜态方法。當一個方法在執行的時候,無法确定其執行細節的時候可以使用委托。如,以通用的數組排序方法,當執行的時候無法确定數組元素的類型,進而無法對其進行比較;這時可以把對資料元素進行比較的方法定義為委托,這樣就可以完成這個通用的數組排序方法。

1. 委托數組:多個委托執行個體,執行多個方法;一個委托執行個體隻能執行一個方法

 delegate double DoubleOp(double x)

  DoubleOp[] operations = {new DoubleOp(方法名), new DoubleOp(方法名)}

 operations[0](100)

2. 多波委托:一個委托執行個體一次執行多個不同的方法,但是執行的順序不能确定

 delegate double DoubleOp(double x)

  DoubleOp operation1 = new DoubleOp(方法名)

  DoubleOp operation2 = new DoubleOp(方法名)

 DoubleOp operations = operation1 + operation2

 operations(100)

 delegate double DoubleOp(double x)

  DoubleOp operations = new DoubleOp(方法名)

  operations += new DoubleOp(方法名)

 operations(100)

 二、匿名方法

匿名方法:簡化委托的實作,在要傳遞的方法比較簡單時,不必定義方法,簡化代碼。

 delegate double DoubleOp(double x)

 DoubleOp operation1 = delegate(double x){return x * 2}

 DoubleOp operation2 = delegate(double x){return x * x}

 DoubleOp[] operations = {operation1, operation2}

 operations[0](100)

 匿名方法的特點:

1. 在匿名方法中不能使用跳轉語句跳轉到該匿名方法的外部,反之亦然

2. 在匿名方法中不能通路不安全的代碼

3. 匿名方法中不能使用外部的ref和out參數,但可以使用匿名方法外部定義的其他變量

三、事件

事件:當一個對象發生了變化通知其他對象發行了什麼變化,這種發式就是事件。事件是對象之間的通訊媒體。委托是事件實作的方式。事件可以在應用程式中傳遞資訊。

1) 事件包括如下概念:

1. 事件發送器:引發事件的對象,如滑鼠按下, 日期大于某一天。事件發送器不知道事件接收器是誰。

2. 事件接收器: 發生某些事件時被通知的任何應用程式、對象或元件。也可以認為是事件處理程式。

3. 事件:一個定義好的委托,事件發送器與事件接收器之間的中介。

4. 注冊(封裝)事件:發送器定義接收器要使用的委托,接收器将事件處理程式注冊到事件中,連接配接事件處理程式的過程稱為封裝事件。

2) .net 事件模型

1. EventHandler委托,無傳回值,其參數為Object和EventArgs, EventArgs可以在發送器與接收器這間傳遞資訊;自定義事件可以繼承這些對象

3) 生成事件

1. 建立事件,即定義一個自定的事件

 public delegate void ActionEventHandler(object sender, ActionCancelEventArgs ev);

 public static event ActionEventHandler Action;

 (ActionCancelEventArgs類也需要建立, 命名與Action事件名對應)

2. 建立事件發送器

 protected void OnAction(object sender, ActionCancelEventArgs ev)

 {

  if (Action != null)

   Action(send, ev);

 }

 (事件引發時執行其對應的委托,命名與Action事件名對應)

3. 建立事件接收器(可以是某個視窗的一個事件)

 private void Form1_Action(object sender, ActionCancelEventArgs ev)

 {

  //do something

  //這裡可以使用sender, ev的一些屬性執行一些邏輯判斷

 }

4. 注冊事件

 Form1.Action += new Form1.ActionEventHandler(Form1_Action)

4) 完成一個自定義事件

場景是定一個自定義事件,給Form1注冊這個事件,在時間大于目前日期是引發該事件,包括三部分:1.事件2.事件引發類3.事件執行類

 1. 事件

 public delegate void ActionEventHandler(object sender, ActionCancelEventArgs ev);(可以在命名空間中任意一處定義)

 public static event ActionEventHandler Action;(是在被注冊事件類中定義,此處是在From1中定義)

 定義ActionCancelEventArgs類

 2. 事件引發類

 private void btnRaise_Click(object sender, EventArgs e)

 {

  ActionCancelEventArgs cancelEvent = new ActionCancelEventArgs();

  OnAction(this, cancelEvent);

  if (cancelEvent.Cancel)

   //......

  else

   //......

 }

 protected void OnAction(object sender, ActionCancelEventArgs ev)(是在被注冊事件類中定義,此處是在From1中定義)

 {

  if (Action != null)

   Action(send, ev);

 }

 3.事件執行類

 Form1.Action += new Form1.ActionEventHandler(Form1_Action)

 private void Form1_Action(object sender, ActionCancelEventArgs ev)

 {

  //do something

  //這裡可以使用sender, ev的一些屬性執行一些邏輯判斷

 }

如果給多個Form注冊Action事件的話,激發事件後所有注冊過該事件的Form都會去響應該事件。這時如果cancelEvent包括所有注冊該事件Form的清單資訊;在執行完所有事件響應後,就可以在btnRaise_Click方法中根據cancelEvent得到每個Form執行完事件的一些信,這時就展現了“事件可以在應用程式中傳遞資訊”。

繼續閱讀