C 中的委託和事件

2021-09-24 17:42:17 字數 2645 閱讀 7982

c#中的委託和事件

c#中的委託和事件續

c#委託的介紹(delegate、action、func、predicate)

c# 中的委託(delegate)類似於 c 或 c++ 中函式指標

關鍵字delegate

delegate
舉例:

public delegate int mydelegate (string s);
委託作為方法的方法:

public void greetpeople(string name, greetingdelegate makegreeting)
public greetingdelegate delegate1;

賦值方式

greetingdelegate delegate1, delegate2;

delegate1 = englishgreeting;

delegate2 = chinesegreeting;

多播方式(可以將多個方法賦給同乙個委託,或者叫將多個方法繫結到同乙個委託)

greetingdelegate delegate1;

delegate1 = englishgreeting; // 先給委託型別的變數賦值

delegate1 += chinesegreeting; // 給此委託變數再繫結乙個方法

既然給委託可以+='繫結乙個方法,

那麼也應該有辦法取消對方法的繫結,很容易想到,這個語法是-=.

event 封裝了委託型別的變數.

使得:在類的內部,不管你宣告它是public還是protected,它總是private的。

在類的外部,註冊+=和登出-=的訪問限定符與你在宣告事件時使用的訪問符相同。

形式上就是在定義委託前多加了乙個event關鍵字.

public class greetingmanager

}

不能在外部進行賦值操作.

只能使用+=-=進行註冊或者刪除.

因為: 儘管我們在greetingmanager裡將 makegreet 宣告為public,但是,實際上makegreet會被編譯成 私有字段,難怪會發生上面的編譯錯誤了,因為它根本就不允許在greetingmanager類的外面以賦值的方式訪問.

萬物基於物件.

參考之前的文章 觀察者模式

為什麼在型別中使用事件向外部提供方法註冊,而不是直接使用委託變數的原因:

從封裝性和易用性

事件應該由事件發布者觸發,而不應該由客戶端(客戶程式)來觸發

將乙個程式看成三個部分. 1. 發布者 2. 訂閱者 3. 客戶端;

以下程式**對應為:

class program 

}// 定義委託

public delegate void numberchangedeventhandler(int count);

// 定義事件發布者

public class publishser

}}// 定義事件訂閱者

public class subscriber ", count);

}}

事件僅僅是供其他型別訂閱,而客戶端不能直接觸發事件(語句pub.numberchanged(100)無法通過編譯)

事件只能在事件發布者publisher類的內部觸發(比如在方法pub.dosomething()中),換言之,就是numberchanged(100)語句只能在publisher內部被呼叫。

還有乙個約定俗稱的規定,就是訂閱事件的方法的命名,通常為「on事件名」,比如這裡的onnumberchanged。

很多的委託定義返回值都為void, 原因:

將事件宣告為private的,然後提供兩個方法來進行註冊和取消註冊:

// 定義事件發布者

public class publishser

// 取消註冊

public void unregister(generaleventhandler method)

public void dosomething() ", rtn); // 列印返回的字串,輸出為subscriber3}}

}

通常情況下,如果需要非同步執行乙個耗時的操作,我們會新起乙個執行緒,然後讓這個執行緒去執行**。

從執行緒池中抓取乙個執行緒去執行該方法,自身執行緒(主線程)在完成抓取執行緒這一過程之後,繼續執行下面的**,這樣就實現了**的並行執行。使用執行緒池的好處就是避免了頻繁進行非同步呼叫時建立、銷毀執行緒的開銷。

**c#中常見的委託

c# 委託應用總結

C 中的委託和事件

委託類似於c 中的函式指標,c 中的委託申明如下 delegate void mydelegate 只要該委託執行的方法與委託申明的簽名一致,就能呼叫委託來執行該方法,例如在本例中,有個方法為 void method 那麼就可以如下呼叫 mydelegate delegate new mydeleg...

C 中的委託和事件

委託 和 事件在 net framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是委託 為什麼...

C 中的委託和事件

較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,下面的例子如果能很好的理解了,那麼基本的委託和事件就基本有所了解了!namespace 委託和事件 方法三委託的定義 public delegate void greetdelegate...