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