本文主要介紹了C#中的委託、事件與非同步的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧
從剛接觸c#程式設計到現在,差不多快有一年的時間了。在學習過程中,有很多地方始終似是而非,直到最近才弄清楚。
本文將先介紹用法,後評斷功能。
一、委託
基本用法:
1.宣告一個委託類型。委託就像是‘類’一樣,聲明了一種委託之後就可以創建多個具有此種特徵的委託。 (特徵,指的是回傳值、參數型別)
public delegate void SomeKindOfDelegate(<a href="//m.sbmmt.com/wiki/57.html" target="_blank">string</a> result);
#2.建立一個在1中創建的委託類型的委託。
public SomeKindOfDelegate aDelegate;
#3.為2中創建的具體的委託添加回應函數。響應函數必須符合1中的‘特徵'。
aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate); private void aFunctionThatJustForDelegate(string result) { MessageBox.Show(result); }
4.完成以上三步驟之後,就可以使用Invoke來對委託進行呼叫了。 Invoke可以選擇呼叫的目標函數,呼叫優先權,以及呼叫的參數。
aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null);
上面是基本用法,除了這種基本用法之外,還可以結合var、匿名委託、lambda委託等方法。
完整程式碼:
namespace wtfIsDelegate { public delegate void SomeKindOfDelegate(string result); public partial class Form1 : Form { public event SomeKindOfDelegate aDelegate; public Form1() { InitializeComponent(); aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate); aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null); } private void btnDelegate_Click(object sender, EventArgs e) { } private void aFunctionThatJustForDelegate(string result) { MessageBox.Show(result); } } }
委託的用處:
委託的優點,是可以實現非同步(BeginInvoke),還可以在某種需要同時呼叫多個同參數、傳回值的情況下簡化程式碼。
二、事件
#基本用法:
1.定義委託。
public delegate void SomeKindOfDelegate(string result);
2.定義事件。
public event SomeKindOfDelegate aDelegate;
3.為事件新增回應函數。
process.Exited += new EventHandler(CmdProcess_Exited);
4.為事件規定觸發(呼叫)方式。 (【也可以沒有觸發方式,直接invoke】)
解說:
C#裡,每一種'事件Event'大概都對應著其'事件處理者EventHandler'。例如Process類別的OutputDataReceived事件對應著DataReceivedEventHandler,對於非特異性的‘事件',例如PasswordChanged 這種,它們統一都對應著RoutedEventHandler或EventHandler這種較為通用的‘事件處理者'。然而,‘EventHandler'也只是充當了一個中介的角色,真正觸發了‘Event'之後要做什麼,還需要我們手動指定,像這樣:
process.Exited += new EventHandler(CmdProcess_Exited); // 注册进程结束事件 。
EventHandler本來也是委託。例如
public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
自訂事件
自訂事件是一種類似委託的方式,
自訂事件某種意義上改變了程式的流程,使得某個條件的變化由'不斷查詢'轉變為'訂閱與處理'的關係。
自訂事件需要有以下幾個元素:
事件的發起者,事件的訂閱,以及事件的處理程序。從發起者到處理程序之間是可以傳遞參數的。
一個事件的'發起'可以依賴某種系統訊息,例如'OnKeyDown'、'OnMouseClick'(【我目前還沒見過這麼寫的源碼】),也可以在某個條件達成時(例如兩次輸入了同樣的字元)自行呼叫(其實收到系統訊息也算是'條件達成')。 【更多的event是這麼寫出來的】
有些事件,並沒有明顯的『發起者』。
委託和事件是啥關係
委託和自訂事件的使用方式十分十分類似。 event 只有類別的內部可以 Invoke,delegate的話,在哪裡都可以Invoke。呼叫的方式似乎也略有區別(傳參方式)
由於呼叫方式和傳參的差異,event顯得更保守/穩定一些。 event也更容易從‘理解’上更容易接受。
delegate似乎更多的用於進行非同步(begin invoke)。而event則更多的用來做自訂事件。
委託與非同步是啥關係
非同步是委託可以實現的功能(或稱為'現象'也可以) 非同步可以由許多其他方式體現,例如多執行緒(thread,threadpool,task等等)。
以上是簡單介紹C#中的委託,事件與非同步的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!