我比較笨系列 《委託 》(三)事件

2021-09-06 03:06:56 字數 1374 閱讀 9224

事件的由來

我們繼續思考上面的程式:上面的三個方法都定義在programe類中,這樣做是為了理解的方便,實際應用中,通常都是 greetpeople 在乙個類中,chinesegreeting和 englishgreeting 在另外的類中。現在你已經對委託有了初步了解,是時候對上面的例子做個改進了。假設我們將greetingpeople()放在乙個叫greetingmanager的類中,那麼新程式應該是這個樣子的:

namespace delegate

}class program

private static void chinesegreeting(string name)

static void main(string args) }}

這個時候,如果要實現前面演示的輸出效果,main方法我想應該是這樣的:

static void main(string args)

我們執行這段**,嗯,沒有任何問題。程式一如預料地那樣輸出了:

morning, jimmy zhang

早上好, 張子陽

static void main(string args)

輸出:morning, jimmy zhang

早上好, jimmy zhang

到了這裡,我們不禁想到:物件導向設計,講究的是物件的封裝,既然可以宣告委託型別的變數(在上例中是delegate1),我們何不將這個變數封裝到 greetmanager類中?在這個類的客戶端中使用不是更方便麼?於是,我們改寫greetmanager類,像這樣:

public class greetingmanager

}現在,我們可以這樣使用這個委託變數:

static void main(string args)

儘管這樣達到了我們要的效果,但是似乎並不美氣,光是第乙個方法註冊用「=」,第二個用「+=」就讓人覺得彆扭。此時,輪到event出場了,c# 中可以使用事件來專門完成這項工作,我們改寫greetingmanager類,它變成了這個樣子:

public class greetingmanager

}很容易注意到:makegreet 事件的宣告與之前委託變數delegate1的宣告唯一的區別是多了乙個event關鍵字。看到這裡,你差不多明白到:事件其實沒什麼不好理解的,宣告乙個事件不過類似於宣告乙個委託型別的變數而已

我們想當然地改寫main方法:

static void main(string args)

這次,你會得到編譯錯誤:事件「delegate.greetingmanager.makegreet」只能出現在 += 或 -= 的左邊(從型別「delegate.greetingmanager」中使用時除外)。

我比較笨《委託》(四) 事件的由來

事件的由來 我們繼續思考上面的程式 上面的三個方法都定義在programe類中,這樣做是為了理解的方便,實際應用中,通常都是 greetpeople 在乙個類中,chinesegreeting和 englishgreeting 在另外的類中。現在你已經對委託有了初步了解,是時候對上面的例子做個改進了...

委託和事件 三 事件詳解

談到事件,不得不牽扯到兩個角色 事件發行者 publisher 乙個事件的發行者,也稱作是傳送者 sender 其實就是個物件,這個物件會自行維護本身的狀態資訊,當本身狀態資訊變動時,便觸發乙個事件,並通知說有的事件訂閱者。事件訂閱者 subscriber 對事件感興趣的物件,也稱為receiver...

委託系列08 委託和事件的區別

emsp 案例 通過委託和事件實現相同的動作 public class cat 方式二 miaoaction?invoke 如果不為null 就執行後面的動作 console.writeline this is delegate public class cat 方式二 miaoaction?inv...