委託和事件

2022-02-02 12:57:05 字數 3605 閱讀 3300

委託和事件:

1.委託:乙個能夠表示方法的資料型別;它將方法作為物件封裝起來,允許在執行時間接地繫結乙個方法呼叫。

2. 宣告委託資料型別:

publicdelegatebool greaterthanhandler(int first , int second);

3.委託的例項化:

為了例項化委託,需要和委託型別自身的簽名對應的乙個方法;例項時不必用new來例項化該類的例項,直接傳遞名稱即可[c>.0新語法]。 如:

greaterthanhandler a =

方法名;

c>.0

以前的語法:

greaterthanhandler a = new greaterthanhandler (

方法名) ;

4. 匿名方法:

匿名方法沒有實際方法宣告的委託例項,它們的定義是直接內嵌在**中的。如:

greaterthanhandler a

delegate(int first , int second)

set

}public cooler(float temperature) //

構造器//

③在事件訂閱者中定義事件處理程式

public

void ontemperaturechanged(float newtemperature)    //

訂閱者方法

else}}

class

heater

//加熱器

set

}public heater(float temperature) //

構造器//

③在事件訂閱者中定義事件處理程式

public

void ontemperaturechanged(float newtemperature)      //

訂閱者方法

else}}

//定義發布者

class

thermostat

set }//

設定由溫度計報告的當前溫度值並觸發事件

private

float _currenttemperature;

public

float currenttemperature

set}}}

}//連線發布者和訂閱者

class

program}}

8.委託運算子:

+= , -= ; + , - ;

注:使用賦值運算子,會清除之前的所有訂閱者,並允許使用新的訂閱者替換它們。

9. multicast

委託的內部機制:

->delegate關鍵字是派生自system.multicastdelegate的乙個型別的別名;multicastdelegate類包含乙個物件引用和乙個方法指標。當向乙個multicast委託新增乙個方法時,multicastdelegate類會建立委託型別的乙個新例項,在新例項中為新增的方法儲存物件引用和方法指標,並在委託例項列表中新增新的委託例項作為下一項。multicastdelegate類維護著由多個delegate物件構成的乙個鍊錶。

但是有兩個問題需要解決:

1)錯誤處理:假如乙個訂閱者引發了乙個異常,鏈中的後續訂閱者就接收不到通知;

2)方法返回值和傳引用:因為呼叫乙個委託,就有可能造成將乙個通知傳送給多個訂閱者,假如訂閱者會返回值,就不確定到底該使用哪個訂閱者的返回值。

以上兩個問題都可以用

getinvocationlist()

方法遍歷每個委託呼叫列表來處理。

10.

事件:事件的目的:

1)event

關鍵字的目的就是提供額外的封裝,避免你不小心地以取消其他訂閱者;

2)事件確保只有包容類才能觸發乙個事件通知;

總言之:event關鍵字提供了必要的封裝來防止任何外部類

發布乙個事件

或取消之前的訂閱者

。下面這段**對上述**進行了修改:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

test

set

}public cooler(float temperature) //

構造器//

③在事件訂閱者中定義事件處理程式

public

void ontemperaturechanged(object sender, thermostat.temperatureargs newtemperature)    //

訂閱者方法

else}}

class

heater

//加熱器

set

}public heater(float temperature) //

構造器//

③在事件訂閱者中定義事件處理程式

public

void ontemperaturechanged(object sender,thermostat .temperatureargs newtemperature)      //

訂閱者方法

else}}

//定義發布者

class

thermostat

public

float newtemperature

set

}private

float _newtemperature;}//

①在事件發行者中定義乙個事件

public

delegatevoid

temperaturechangehandler(object sender, temperatureargs newtemperature);   //

定義委託資料型別,注意這是乙個巢狀類;

public

event

temperaturechangehandler ontemperaturechange;

//public temperaturechangehandler ontemperaturechange         //

儲存訂閱者列表,只需乙個委託字段即可儲存所有訂閱者(委託鏈)。

////    set

//}//private temperaturechangehandler _ontemperaturechange;

//設定由溫度計報告的當前溫度值並觸發事件

public

float currenttemperature

set}}}

private

float _currenttemperature;}//

連線發布者和訂閱者

class

program}}

委託和事件

主要過程如下 1.在後台 中,我們可以定義處理程式方法alartrang 2.然後定義委託,引用到處理程式方法的例項。3.最後將委託新增到事件中。從而,引發事件時就會呼叫相關的事件處理方法。若要使用在另乙個類中定義的事件,必須定義和註冊乙個事件處理程式。事件 處理程式必須具有與為事件宣告的委託相同的...

委託和事件

委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...

事件和委託

事件是物件傳送的訊息,以發訊號通知操作的發生。操作可能是由使用者互動 例如滑鼠單擊 引起的,也可能是由某些其他的程式邏輯觸發的。引發事件的物件稱為事件傳送方。捕獲事件並對其作出響應的物件叫做事件接收方。在事件通訊中,事件傳送方類不知道哪個物件或方法將接收到 處理 它引發的事件。所需要的是在源和接收方...