委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if-else(switch)語句,同時使得程式具有更好的可擴充套件性。
在c#中使用delegate關鍵字定義委託,然後使用我們熟悉的函式呼叫的語法來呼叫委託。
public
delegate
void
deletedetailhandler
(int resultvalue)
;
當我們用delegate關鍵字宣告委託時,編譯器自動為我們生成類。類的名字即為委託變數名,訪問型別為定義的委託訪問型別。如上例中,定義的委託對應的類為deletedetailhandler,訪問型別為public,該類繼承自[mscorlib]system.multicastdelegate。如果我們定義委託的訪問型別為private或者protected,則對應的委託類的訪問型別為private或者protected。但是任何委託都繼承自[mscorlib]system.multicastdelegate。
微軟的定義:和委託類似,事件是後期繫結機制。 實際上,事件是建立在對委託的語言支援之上的。事件基於委託,為委託提供了一種發布/訂閱機制。
在類的內部宣告事件,首先必須宣告該事件的委託型別(這裡我們直接使用上個例子中定義的委託型別deletedetailhandler)。然後,宣告事件本身,使用event關鍵字,例如:
public
event
deletedetailhandler ondeletedetail;
從事件的宣告,我們可以大致看出事件與委託的關係:
事件是委託的特殊實現,事件是建立在對委託的語言支援之上的。
委託是一種型別,事件是委託型別的乙個例項,加上了event的許可權控制,限制許可權,只允許在事件宣告類裡面去invoke和賦值,不允許外面,甚至子類呼叫。
但是很多時候,在新的執行緒中,我們需要與ui(windows窗體設計器使用者介面)進行互動,在c#中不允許直接這樣做。
windows窗體中的控制項被繫結到特定的執行緒,不具備執行緒安全性。因此,如果從另乙個執行緒呼叫控制項的方法,那麼必須使用控制項的乙個invoke方法來將呼叫封送到適當的執行緒。正如所看到的,必須呼叫invoke方法,而begininvoke可以認為是invoke的非同步版本。
這裡我們想要通過執行緒刪除id為1的使用者,刪除之後修改文字框內容。
首先定義乙個工具類,將委託、事件、執行緒與執行緒呼叫的方法統一寫在這個類中,方便呼叫。
deletedetail方法中定義執行緒,並設定執行緒為後台執行緒。執行緒結束時呼叫事件ondeletedetail,並將結果返回。
using system.threading;
public
event
deletedetailhandler ondeletedetail;
public
void
deletedetail
(long detailid)
private
void
deletedetail
(object detailid)
}}
在刪除按鈕的觸發事件中,例項化工具類。註冊委託deletedetailhandler使用控制項的this.invoke方法來將呼叫封送到主線程,修改文字框內容。
至此,委託、事件與執行緒的使用就介紹到這裡了。
C 委託 事件 執行緒
這是幾個簡單的例子,但是實際的開發中委託還還只在反射時用到過,事件的話只自己做了一次,並且還是特意去用的 實際上可以不用。執行緒的話,因為需要,所以用的會多點,這裡主要是ws上的執行緒。委託 在前面的反射例項中,也有用到委託執行方法。這個例子是將乙個方法或者委託例項作為另外乙個函式的入參傳遞。至於有...
c 委託事件
1,什麼是委託 委託是什麼?從生活理解就像是你是乙個c 程式設計師,你對c 並不了解,當需要進行c 分析的時候你委託給你的一位懂c 的同事幫你來完成 在c 中,委託的作用是這樣描述的 委託就像乙個函式的指標,在程式執行時可以使用它們來呼叫不同的函式。簡單點說,委託能夠引用函式,通過傳遞位址的機制完成...
C 委託事件
一 委託 委託類似於函式指標,但函式指標只能引用靜態方法,而委託既能引用靜態方法,也能引用例項方法。委託使用分三步 1 委託宣告。2 委託例項化。3 委託呼叫。例程一 程式 using system namespace 委託 private int add int num1,int num2 例中,...