C 委託與事件 簡單筆記

2022-01-11 08:37:56 字數 2635 閱讀 2020

簡單記錄點東西 適合似懂非懂的朋友看看

委託型別用來定義和響應應用程式中的**。

藉此可以設計各種有物件導向特性的**模式。下面要說的事件在我看來就是委託的一種實現,再深一步講,利用委託加事件,是不是可以構建各種所謂的管道框架。

asp.net webapi的管道模型,整個訊息處理管道是通過一組有序的httpmessaghandler「首尾相連」而成,具體實現「串聯」的是通過delegatinghandler這個型別來完成的。即是一組委託鏈

最精華的內容您已看完

委託定義 public delegate int delename(int x);

名稱引數

返回值

delename del = m1;

public int m1(int i)

入門理解1:委託是方法的型別,即委託=class,方法=new class()

上面的方法名稱m1只起到傳遞作用時,可以用匿名委託代替:

delename del = delegate (int i)

;

除了用匿名委託,還可以用lamda表示式進行代替:

delename del =  (int i)=>

;

public delegate void mygenericdelegate1(t arg);

public delegate int mygenericdelegate2(t arg,m name);

mygenericdelegate1inttarget = new mygenericdelegate(inttarget);

static void inttarget(int arg) => console.writeline($"inttarget--> ");

mygenericdelegate2inttarget1 = (int arg,string name) =>

;

好處:封裝為了復用

看下上面兩個委託的命名:mygenericdelegate1 mygenericdelegate2 純粹為了取名而取名,此時我們可以不自己取名。

怎麼做呢,c#本身提供了兩個泛型委託可以給我們使用,且可滿足大多數場景。

action<>:無返回值: 定義 public delegate void action<...>

public static void show()

// action<> 委託的乙個目標

private static void displaymessage(string msg, consolecolor txtcolor, int printcount)

func<>:有返回值 public delegate tresult func<... out tresult> tresult:返回值型別

funcfunctarget = new func(add);

functarget(1, 2);

static int add(int x, int y) => x + y;

如果你覺得乙個具有自定義名稱的委託更有助於捕獲問題範疇,那麼構建自定義委託不過就是一行**的事兒。

注:linq中就大量的用到了 action<> 和 func<>。

最簡單的說法是:可以把事件看成是委託的乙個例項。委託比作類:它定義了函式的簽名(接受什麼型別的引數 返回什麼型別的值)事件比作委託new出來的乙個例項,是具有該委託簽名的具體函式。當然事件和例項也是有區別的:

1、事件這個東西 能容納很多個具體的函式(通過+= -= 增加刪除)。

2、事件有event關鍵字起到了保護作用不允許改變事件的引用。即在宣告事件的類外部不能用=對事件物件賦值

public delegate void helloworlddelegate(string name);

public class helloworldclass2

;//在宣告事件的類內部可以用=直接定義事件的引用(賦值)

del(name);}}

class program

static void byenglish(string name)

static void bychinese(string name)

}

事件預設是個多播委託,什麼是多播委託呢?就是上面的h2.del委託容納的方法有多個,byenglish跟bychinese,用+=可以繼續往下延伸。

委託和事件的區別在於,事件是個規約,委託是個實現(當然抽象上的委託也可以不是個具體的實現)。

規約的含義是,我定義了這麼個語法,你可以通過+=和-=把委託掛載到這個東西(事件)上,當發生這個事件的時候,我會確保這些委託都被得到呼叫。但是具體是怎麼呼叫的,你不用關心。

原文:

C 事件與委託簡單實現

假設我們有個高檔的熱水器 heater 我們給它通上電,當水溫超過95度的時候 1 揚聲器 alarm 會開始發出語音,告訴你水的溫度 2 液晶屏 display 也會改變水溫的顯示,來提示水已經快燒開了。可以建立如下事件與委託 在控制台下實現 heater.cs using system usin...

C 學習筆記 委託與事件

委託是一種程式特性,用於表示方法 方法的代表,方法的指標 通俗來說就是自己做不了的,通過委託任務給別人來完成。在委託中,可以動態的增加或刪減具體方法與委託變數的關聯。多播委託是指委託變數中有多個具體方法,委託變數執行時會按照具體方法加入的先後順序,執行具體方法。1 宣告委託 1 宣告委託 publi...

C語言簡單筆記

因為疫情原因,原本線下進行的c語言程式設計只能改為線上學習,學習效果不是很好,因此趁暑假的機會回顧一下c語言的主要知識。今天覆習的主要內容 資料型別,常量與變數。一 資料型別 c語言中,資料對使用者的呈現方式分為常量和變數,並且常量和變數都有不同的型別。具有相同性質的資料的集合可以看成一種資料型別。...