C裡事件和委託有什麼區別啊,c 事件和委託有些什麼區別,求大神淺顯易懂地解

2022-02-28 14:59:38 字數 4199 閱讀 6293

1樓:oooo泡

一 、使用位置不同

事件只能在本型別內部「觸發」,委託不管在本型別內部還是外部都可以「呼叫」。

二、使用符號不同

在類的外部,事件只能用「+=」和「-=」去訂閱/取消訂閱,如果是委託的話還可以使用「=」。

2樓:匿名使用者

委託的本質,是一個,而事件,是委託這個類的一個私有變數加上兩個公有方法(事件的+=和-=這兩個公有方法,和委託例項的+=和-=功能上非常像,但並不是同一個東西),這是本質區別。

打個比方,string 也是一個類,而string s = "a",這個s是string這個類的一個變數(略有不恰當,為了方便直觀理解,那麼,委託是和string這個類同等的地位,而事件,是和s這個變數同等的地位)。

public delegate void mydel();相當於你建立了一個mydel的類,所以委託可以在任何地方建立,類需要例項化,所以委託需要例項化,要mydel m = ……;

申明一個事件 public event mydel myevent;

事件myevent類似於是一個mydel型別的一個變數,因為是變數,所以事件只能在類裡面申明,不需要例項化,有點類似於上面的那個m。

既然myevent(類似)和變數m都是mydel型別的一個變數,為什麼還要弄一個事件這種東西出來,變數m不就可以實現事件的需求(監聽,廣播)嗎?這裡牽涉到了物件導向的一些設計理念,事件可以理解為委託例項m的一個約束版。

第一:委託例項m,**都可以用「+=」,「-=」,「=」三種方式,事件myevent也可以用「+=」,「-=」,「=」三種方式,但是,事件的「=」必須要在申明他的類裡面,才能用,外部,不能用,外部只需要關注註冊「+=」和登出「-=」即可。因為外部如果可以用「=」,就會覆蓋原有的其他註冊進來的方法,這表明不安全,違背了封裝性,外部的監聽者,你只能管好自己是否監聽,而不能因為你的監聽誤操作(「=」),覆蓋了其他的未知監聽者,所以在外部事件不允許用「=」。

第二:委託例項m,可以在任何地方呼叫,而事件myevent,只能在申明他的類裡面呼叫。這種限制,也是從物件導向的理念考慮。

假設某個類(class a)裡面有一個事件,當這個類(class a)的裡面的某某屬性(int b)發生了變化,然後發出通知,告訴所有的監聽者。那麼這個屬性b,變沒變,什麼時候變,只能由a這個類自己知道,自己決定,自己觸發,外部的任何類,無權過問,而委託的例項可以在任何地方呼叫,不符合這種封裝性。

事件就是把委託例項的所有權利,都留給申明他的類,而只開放委託例項的註冊和登出功能,給外部類。

事件最常用的場景,是用於廣播變化給監聽者,委託最常用的場景,是用於將方法當做引數進行傳遞(當然,委託也可以達到和事件一樣的廣播效果,不過沒有事件那麼安全)

3樓:律雲淦弘麗

事件是類在發生其被關注的事情時用來提供通知的一種方式。

使用事件,物件a可以將關於事件或已發生變化的資訊通知其他物件b。

引發事件的物件稱為事件傳送方源。

捕獲事件並對其作出響應的物件叫做事件接收方。

在事件通訊中,傳送方不知道哪個物件或方法將接收【處理】它引發的事件。故需要在傳送方和接收方之間存在一個媒介【或類似

指標的機制】。.net

framework

定義了一個特殊的型別

(delegate),該型別提供函式指標的功能。

事件使用委託來為觸發時將呼叫的方法提供型別安全的封裝。

這段話是我珍藏的,比較抽象。

為什麼不能直接用委託代替事件?我個人覺得,在事件通訊這個模式下,這是規定好的:事件+=委託(方法)。

如果按您的想法,直接委託+方法,那麼接收方如何知道你到底幹了什麼事情,是雙擊了button,還是單擊了一下窗體,又或者幹了其他事情。首先沒有方法知道,那麼接收方呼叫哪個委託(方法)呢?

您好好看看剛開始的那段話,應該會有很大幫助。

4樓:科魔弈

委託是函式的模板,類似於c++的函式指標,表示一類函式。委託的本質是類,所有的委託都派生自 system.delegate 類。

事件是特殊的委託例項,本質是委託例項,是一個物件。與委託例項的區別主要是封裝。

5樓:匿名使用者

事件就是一個狹義的委託,也就是事件是一個用於事件驅動模型的專用委託.

通俗的講,委託你可以在客戶**中直接呼叫委託來激發委託指向的函式,而事件不可以,事件的觸發只能由服務**自己觸發

也就是說在你的**裡委託你不但可以安排誰是它的呼叫函式,還可以直接呼叫它,而事件不能直接呼叫,只能通過某些操作觸發

你可以理解事件就是一個或多個委託,此話應該有誤的吧,事件可以有多個事件處理函式,委託同樣也可以是個多播委託

6樓:喬克

其實委託可以理解為用方法作為引數 傳入另一個方法中  傳送門

7樓:叫我俠哥哥

方法  事件 都是函式

方法是內觸發針對的使用者是程式猿。

事件是外觸發(特定的輸入訊號響應特定的操作)針對的使用者是應用程式的使用者

委託是函式指標(是一中可以把函式當做變數的型別),委託變數的值是可以改變的,封裝了很多函式(方法和事件)

個人經驗,說的不好勿噴

8樓:

你可以理解事件就是一個或多個委託

c#事件和委託有些什麼區別,求大神淺顯易懂地解

9樓:匿名使用者

delegate

delegate是c#中的一種型別,它實際上是一個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有一個簽名(signature),並且它"只能持有與它的簽名相匹配的方法的引用"。它所實現的功能與c/c++中的函式指標十分相似。

它允許你傳遞一個類a的方法m給另一個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式委託和事件在 .net framework中的應用非常廣泛指標不具備的優點。

首先,函式指標只能指向靜態函式,而delegate既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,delegate不但儲存了對此函式入口指標的引用,而且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,delegate是物件導向、型別安全、可靠的受控(managed)物件。

也就是說,runtime能夠保證delegate指向一個有效的方法,你無須擔心delegate會指向無效地址或者越界地址。

實現一個delegate是很簡單的,通過以下3個步驟即可實現一個delegate:

1. 宣告一個delegate物件,它應當與你想要傳遞的方法具有相同的引數和返回值型別。

2. 建立delegate物件,並"將你想要傳遞的函式作為引數傳入"。

3. 在要實現非同步呼叫的地方,通過上一步建立的物件來呼叫方法。

瞭解了delegate,下面我們來看看,在c#中對事件是如何處理的。

c#中的事件處理實際上是一種具有特殊簽名的delegate,象下面這個樣子:

public delegate void myeventhandler(object sender, myeventargs e);

其中的兩個引數,sender代表事件傳送者,e是事件引數類。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。

當然,如果你的事件不含引數,那麼可以直接用system.eventargs類作為引數。

就是這麼簡單,結合delegate的實現,我們可以將自定義事件的實現歸結為以下幾步:

1.定義delegate物件型別,它有兩個引數,第一個引數是事件傳送者物件,第二個引數是事件引數類物件。

2.定義事件引數類,此類應當從system.eventargs類派生。如果事件不帶引數,這一步可以省略。

3.定義"事件處理方法,它應當與delegate物件具有相同的引數和返回值型別"。

4.用event關鍵字定義事件物件,它同時也是一個delegate物件。

5.用+=操作符新增事件到事件佇列中(-=操作符能夠將事件從佇列中刪除)。

6.在需要觸發事件的地方用呼叫delegate的方式寫事件觸發方法。一般來說,此方法應為protected訪問限制,既不能以public方式呼叫,但可以被子類繼承。名字是oneventname。

7. 在適當的地方呼叫事件觸發方法觸發事件。

下面是一個簡單的例子:

vc 和c 有什麼區別,VC 與C 有什麼區別和聯絡?

c 是一種標準 一般由ansi來規範 vc 是一種實際存在的語言,由微軟公司設計開發。microsoft visual c 簡稱visual c msvc vc 或vc 微軟公司的c 開發工具,具有整合開發環境,可提供編輯c語言,c 以及c cli等程式語言。c 是一種使用非常廣泛的計算機程式語言。...

C裡,tag和index有什麼區別呢

tag就是一個標籤,bai簡du單點說 就是存放一zhi 個在程式設計過程dao中要用的一個資料。內這個標籤容存放什麼樣的資料型別都是可以的,不過放進去的都是object型別的,用的時候要注意型別的轉換,tag一般存放的都是我們編寫程式的時候要用到的。index是下標,也就是索引,就跟陣列或者是集合...

學C和學C有什麼區別的

學c更偏向於 機器一點,更人性化一些。c是程序導向的 c 是物件導向的 這是兩種說法可以不用管,只是不同的程式設計方式。但是都可以作為程式設計學習的入門。兩者都有共通性,學完其中一個看另一個也會很快。既然lz不知道兩個的區別 那就說明沒特別的學習目的,那麼手上有哪個教程就學哪個就行了。不用太糾結 c...