簡單介紹C#中的委託,事件與非同步用法

來源:互聯網
上載者:User
本文主要介紹了C#中的委託、事件與非同步相關知識。具有很好的參考價值。下面跟著小編一起來看下吧

從剛接觸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'(【我目前還沒見過這麼寫的源碼】),也可以在某個條件達成時(比如兩次輸入了同樣的字元)自行調用(其實收到系統訊息也算是‘條件達成')。【更多的event是這麼寫出來的】

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

委託和事件是啥關係

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

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

delegate貌似更多的用於進行非同步(begin invoke)。而event則更多的用來做自訂事件。

委託和非同步是啥關係

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.