誰能通俗易懂地解釋一下C 中的事件和委託?

時間 2021-05-13 04:38:59

1樓:MiLoser

講簡單點吧

有這麼乙個場景,有一天你突然寫方法的時候想著如果方法能接收乙個方法做為引數的話那就是委託了

委託就相當於乙個未知的方法,它是可以做為引數傳遞到另乙個方法裡的

而委託本質上是乙個類,和你平時寫的也沒什麼區別,甚至你可以模擬這樣乙個方法,方法的某個引數是另乙個介面,方法內部在做完某些操作後會呼叫這個介面的某個方法,這個時候外部呼叫你這個方法時它的傳進來的介面例項是不是會觸發他介面例項裡的那個方法?是不是就和委託很像了

而微軟已經給我們封裝好了ACtion和Fuc,已經不太需要我們自己去宣告委託了

現在外部呼叫者覺得傳遞委託進方法裡面很麻煩,因為他要再定義乙個委託定義乙個指向方法,而簡單的就是直接傳遞Lamada表示式

所以你看,這其實都是已經封裝好的語法糖

接下來你又有乙個需求,我不想傳遞方法,但我有乙個需求是在使用者呼叫了某個方法後能通知呼叫者我做了什麼改變以便呼叫者進行下一步操作,這個時候我也可以宣告乙個全域性的委託

但這樣不好的是呼叫者可以隨意更改這個委託,怎麼讓呼叫者不能更改只能給它賦值呢,那就是事件了,事件只能增加或移除,不能給它賦為null或其它的方法

2樓:

委託,就是個指標,就比如,void型指標,或者int型指標,這種。當呼叫這個指標的時候,就是呼叫了這個指標所指的那個位置的函式。

事件就是兩個相同型別的指標,挨在一塊,乙個指標執行完了,馬上就執行下乙個指標,這樣就相當於把另乙個函式也給呼叫了。

也就是執行乙個,就能導致另乙個執行,這就是事件了。

3樓:

委託本質就是乙個型別,這個型別建立的變數是用來儲存方法的,好比int也是乙個型別,int型別的變數用來儲存1,2,3這樣的整型變數的。

事件是特殊的委託,已經定義好的委託型別,可以直接使用。

4樓:荒野的過客

通俗一點啊。

你在知乎關注了某個問題或者某個人=你監聽了某個事件。

你關注的問題或者人有了新的回答=通過觀察者模式,你接受到了這個事件。

你通過知乎通知中的鏈結快速跳轉到該回答,或者通過這篇回答中的鏈結跳轉到其他回答=將事件作為事件得引數傳遞給你=委託。

5樓:

事件:過載了操作符的函式閉包

委託:函式閉包

結束。然後發現這是個6年前的問題,丟人了。。。反正用現在的眼光就是這麼理解的吧。

有用過 nodejs 的 EventsEmitter 就能懂了,但C#的事件更像是 rxjs 的 subject。

C#的事件就強在於通過過載操作符把事件的訂閱和退訂最簡化,其它語言有些就跟本實現不了。

6樓:煙雨六月

可以看一下我年輕時候寫的文章:https://

blog.csdn.net/wb0910031

0/article/details/44218933

7樓:returnTrue

委託是一種特殊的類,類不能直接使用,要例項化,例項化後得到的就是事件。事件是乙個容器,可以把很多方法的引用通過add方法加進去,我們叫註冊,就像乙個Dictionary一樣。你看到的+=其實是語法糖。

這也顯示出了委託為何和普通的類不一樣了,普通的類必須要寫乙個add方法,但是c#對委託這種類特殊處理了,增加了這麼乙個語法糖。當呼叫事件的時候,所有放進去方法,都會被呼叫,如果你的方法不想被呼叫,那麼就通過remove方法移除,也就是-=。

看一下我寫的這篇部落格,也許對你理解委託和事件有幫助。

8樓:張鵬飛

主要講事件,因為平常用事件比較多,直接用委託的機會比價少,我估計提問者提出問題,也是看一些類庫中的事件不明白才提問。

委託是一種型別,也就是描述方法是什麼樣的,當然包括返回值+變數,模擬來看,就對應String;

事件是某一種委託,也就是是指某個委託,模擬來看,就對應String str=new String("上課鈴響了") 中的「上課鈴響了」;

事件的觸發,就相當於方法執行了,模擬來看,就相當於String str=new String("上課鈴響了") 中的new String這個動作;

事件本身就和訂閱者模式天然匹配。訂閱者可以訂閱某個事件,不要忘了事件是在方法的維度考慮,因此就是訂閱者的某個方法訂閱事件,這樣才對等,即方法訂閱實踐。

所謂「訂閱」,就可以理解為使用,模擬String,「上課鈴響了」這個字串被另外乙個類的方法所使用。

因此當觸發事件(new String)的時候,使用了這個事件(「上課鈴響了」)的類的方法,都要被呼叫。

當然,事件的底層,都是靠委託來實現的。

9樓:

// 簡略版,抄的

using

System

;class

主程式class室友}

static

void

Main

(string

args)}

// 匿名方法委託:

// 最重要的區別在於:不需要乙個實體來接受委託(你的委託寄存在虛空之中!)

using

System

;delegate

void

委託();

class

主程式static

void

Main

(string

args);

// 使用匿名方法呼叫委託

乙個委託

();// 使用命名方法例項化委託

乙個委託

=new委託(

買幾個橘子

);// 使用命名方法呼叫委託

乙個委託

();}}

10樓:Cicin

對於委託:

是什麼:委託是特殊的型別,就是函式指標,可引用一系列函式,同時定義了這一系列函式的資料處理規範(或者說訊息規範,即向這些函式傳遞哪些引數,需要返回什麼樣的型別);

為什麼:降低不同模組的耦合度(依賴程度)

怎麼用:通過事件的發布、訂閱模式,非常容易處理各個事件;

對於事件:

事件化的特殊委託,對於事件只可以用來增加訂閱者或者減少訂閱者,增加了安全性。

舉例:首領A要搞一場鴻門宴,吩咐部下拳擊手B和弓弩手C各自帶隊埋伏在屏風兩側,約定以杯為令:若左手舉杯,則B帶隊殺出;若右手舉杯,則C帶隊殺出;若直接摔杯,則B和C同時殺出。

B和C襲擊的具體方法,首領A並不關心。

用了委託事件後,首領A中定義A發出的訊息介面規範,B/C/通過這個規範處理相應的訊息。這樣,A中只要知道自己能做什麼、並發出約定了的規範訊息就可以了,A不用告訴B/C/等怎麼做(降低了耦合度),怎麼做的事情在B/C/等中定義,符合按按名詞概念進行類設計的理念。即使增加了」美女D,見雙手舉杯使出美人計「,因為在A中定義了訊息規範,只要增加美女部下D對於A發出訊息的訂閱就可以了。

各司其職,互少干擾。

11樓:

C#基礎---委託的使用 - 我有一顆四葉草 - 部落格園

C#基礎---事件的使用 - 我有一顆四葉草 - 部落格園

自己寫的兩篇部落格希望有幫助

12樓:Panter

委託:委託實際上是乙個類,在定義委託前就知道了方法的返回型別和方法的引數型別(可以把委託理解為只知道方法的返回型別和方法的引數型別,不知道方法體)

宣告委託:public delegate void GreetingDelegate(string name);

事件: 宣告乙個事件不過類似於宣告乙個進行了封裝的委託型別的變數而已

宣告事件: public event GreetingDelegate MakeGreet;

//等價於private GreetingDelegate MakeGreet;

13樓:程式狗

Attention:本文沒有任何概念介紹,旨在幫助同學們快速用上委託和事件,進入C#的更高境界。

using

System

;using

System.Collections.Generic;using

System.Linq

;using

System.Text

;using

System.Threading.Tasks;namespace

TestDemo

}public

class

項羽!"

,name

);if

(KillEvent

!=null)}

public

void

拔劍()}}

public

class

刀斧手一號

public

刀斧手一號(項羽

xiangYu

)public

void

Do_Kill

(string

name)了"

,name);}

public

void

Do_KillAll()}

public

class

刀斧手二號

public

刀斧手二號(項羽

xiangYu

)public

void

Do_Kill

(string

name)了"

,name);}

public

void

Do_KillAll()}}

14樓:小貓咪的大老虎

//個人看法

事件對於委託的關係類似於

屬性對於字段

就像屬性的 get set 可以提供私有欄位的安全訪問事件內部也有乙個看不到的私有委託,類似自動分配看不到的私有欄位的屬性因此事件可能是經過某種包裝,保證了對私有委託的安全訪問吧

誰能通俗易懂地解釋一下「融資租賃」?

牛墨王 房屋按揭貸款類似。融資租賃標的是裝置類或其他類有形動產 不做土地和房子 租賃期間一般沒房屋按揭那麼長,其他基本類似只能這麼通俗了。 挖山農夫 與分期購買,並沒有實質區別。站在承租人的角度看,融資租賃,與其說是租賃,不如說是購買行為的一種融資方案,名義上的 所有權 這個東西,則是這個融資方案中...

誰能用通俗易懂的話解釋一下雲備災?

童魏肝 隨著雲計算產業的蓬勃高速發展,越來越多的企業使用者開始選擇使用雲服務,把業務 資料都放在 雲端 同時就衍生出乙個新詞彙 雲備災 然而,雲備災是什麼呢?字面理解大家應該都懂,就是企業利用雲來防患未然。就好比自然災害來臨之前國家準備了很多必要物資來救助大家乙個道理。只不過雲更智慧型而已!就是企業...

能否通俗易懂的解釋一下和弦?

改變自己 乙個音叫單音,兩個音叫音程,三個音及以上的三度疊置叫和弦。和弦的名稱是根據度數和性質 可以理解為聲音的色彩 決定的。度數可以理解為台階,dol re mi fa sol la si是向上排列的7個台階,每乙個就是一度。所以,音越多,和弦切換越頻繁,其包含的色彩和感覺就越豐富。 愛吃檸檬的小...