国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

淺談C#中的委托、事件與異步

2019-10-29 21:12:14
字體:
來源:轉載
供稿:網友

從剛接觸c#編程到現在,差不多快有一年的時間了。在學習過程中,有很多地方始終似是而非,直到最近才弄明白。

本文將先介紹用法,后評斷功能。

一、委托

基本用法:

1.聲明一個委托類型。委托就像是‘類'一樣,聲明了一種委托之后就可以創建多個具有此種特征的委托。(特征,指的是返回值、參數類型)

public delegate void SomeKindOfDelegate(string 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'(【我目前還沒見過這么寫的源碼】),也可以在某個條件達成時(比如兩次輸入了同樣的字符)自行調用(其實收到系統消息也算是‘條件達成')?!靖嗟膃vent是這么寫出來的】

有些事件,并沒有明顯的‘發起者'。

委托和事件是啥關系

委托和自定義事件的使用方式十分十分類似。event 只有類的內部可以 Invoke,delegate的話,在哪都可以Invoke。調用的方式貌似也略有區別(傳參方式)

由于調用方式和傳參的差異,event顯得更保守/穩定一些。event也更容易從‘理解'上更容易接受。

delegate貌似更多的用于進行異步(begin invoke)。而event則更多的用來做自定義事件。

委托和異步是啥關系

異步是委托可以實現的一種功能(或者叫做‘現象'也可以) 異步可以由很多種其他方式體現,比如多線程(thread,threadpool,task等等)。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏山县| 武乡县| 和田市| 灵寿县| 彭阳县| 澄江县| 泰兴市| 广安市| 望都县| 大庆市| 延边| 大城县| 祁阳县| 香格里拉县| 稷山县| 怀仁县| 镇远县| 平南县| 新宁县| 高雄市| 治多县| 忻城县| 沾化县| 图木舒克市| 肥东县| 昌宁县| 六盘水市| 克东县| 通城县| 遂宁市| 叶城县| 南和县| 新沂市| 长垣县| 顺昌县| 通州市| 烟台市| 于田县| 琼中| 西藏| 南投县|