c#中的委託和事件c# 中的委託(delegate)類似於 c 或 c++ 中函式指標c#中的委託和事件續
c#委託的介紹(delegate、action、func、predicate)
關鍵字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...