C 中的委託和事件 2

2021-05-05 05:24:16 字數 2466 閱讀 4100

我們繼續思考上面的程式:上面的三個方法都定義在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)

輸出為:

morning, jimmy zhang

早上好, jimmy zhang

儘管這樣做沒有任何問題,但我們發現這條語句很奇怪。在呼叫gm.greetpeople方法的時候,再次傳遞了gm的delegate1欄位:

gm.greetpeople("jimmy zhang", gm.delegate1);

既然如此,我們何不修改 greetingmanager 類成這樣:

public

class

greetingmanager}}

在客戶端,呼叫看上去更簡潔一些:

static

void main(string args)

輸出為:

morning, jimmy zhang

早上好, jimmy zhang

儘管這樣達到了我們要的效果,但是還是存在著問題:

在這裡,delegate1和我們平時用的string型別的變數沒有什麼分別,而我們知道,並不是所有的字段都應該宣告成public,合適的做法是應該public的時候public,應該private的時候private。

我們先看看如果把 delegate1 宣告為 private會怎樣?結果就是:這簡直就是在搞笑。因為宣告委託的目的就是為了把它暴露在類的客戶端進行方法的註冊,你把它宣告為private了,客戶端對它根本就不可見,那它還有什麼用?

再看看把delegate1 宣告為 public 會怎樣?結果就是:在客戶端可以對它進行隨意的賦值等操作,嚴重破壞物件的封裝性。

最後,第乙個方法註冊用「=」,是賦值語法,因為要進行例項化,第二個方法註冊則用的是「+=」。但是,不管是賦值還是註冊,都是將方法繫結到委託上,除了呼叫時先後順序不同,再沒有任何的分別,這樣不是讓人覺得很彆扭麼?

現在我們想想,如果delegate1不是乙個委託型別,而是乙個string型別,你會怎麼做?答案是使用屬性對欄位進行封裝。

於是,event出場了,它封裝了委託型別的變數,使得:在類的內部,不管你宣告它是public還是protected,它總是private的。在類的外部,註冊「+=」和登出「-=」的訪問限定符與你在宣告事件時使用的訪問符相同。

我們改寫greetingmanager類,它變成了這個樣子:

public

class

greetingmanager

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

為了證明上面的推論,如果我們像下面這樣改寫main方法:

static

void main(string args)

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

C 中的委託和事件

委託類似於c 中的函式指標,c 中的委託申明如下 delegate void mydelegate 只要該委託執行的方法與委託申明的簽名一致,就能呼叫委託來執行該方法,例如在本例中,有個方法為 void method 那麼就可以如下呼叫 mydelegate delegate new mydeleg...

C 中的委託和事件

委託 和 事件在 net framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是委託 為什麼...

C 中的委託和事件

較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,下面的例子如果能很好的理解了,那麼基本的委託和事件就基本有所了解了!namespace 委託和事件 方法三委託的定義 public delegate void greetdelegate...