盡管這樣達到了我們要的效果,但是似乎并不美氣,光是第一個(gè)方法注冊用“=”,第二個(gè)用“+=”就讓人覺(jué)得別扭。此時(shí),輪到Event出場(chǎng)了,C# 中可以使用事件來(lái)專(zhuān)門(mén)完成這項工作,我們改寫(xiě)GreetingManager類(lèi),它變成了這個(gè)樣子:
以下是引用片段:
publicclassGreetingManager{
//這一次我們在這里聲明一個(gè)事件
publiceventGreetingDelegateMakeGreet;
publicvoidGreetPeople(stringname,GreetingDelegateMakeGreeting){
MakeGreeting(name);
}
}
很容易注意到:MakeGreet 事件的聲明與之前委托變量delegate1的聲明唯一的區別是多了一個(gè)event關(guān)鍵字??吹竭@里,你差不多明白到:事件其實(shí)沒(méi)什么不好理解的,聲明一個(gè)事件不過(guò)類(lèi)似于聲明一個(gè)委托類(lèi)型的變量而已。
我們想當然地改寫(xiě)Main方法:
以下是引用片段:
staticvoidMain(string[]args){
GreetingManagergm=newGreetingManager();
gm.MakeGreet=EnglishGreeting;//編譯錯誤1
gm.MakeGreet+=ChineseGreeting;
gm.GreetPeople("JimmyZhang",gm.MakeGreet);//編譯錯誤2
}
這次,你會(huì )得到編譯錯誤:事件“Delegate.GreetingManager.MakeGreet”只能出現在 += 或 -= 的左邊(從類(lèi)型“Delegate.GreetingManager”中使用時(shí)除外)。
事件和委托的編譯代碼
這時(shí)候,我們不得不注釋掉編譯錯誤的行,然后重新進(jìn)行編譯,再借助Reflactor來(lái)對 event的聲明語(yǔ)句做一探究,看看為什么會(huì )發(fā)生這樣的錯誤:
public event GreetingDelegate MakeGreet;

可以看到,實(shí)際上盡管我們在GreetingManager里將 MakeGreet 聲明為public,但是,實(shí)際上MakeGreet會(huì )被編譯成 私有字段,難怪會(huì )發(fā)生上面的編譯錯誤了,因為它根本就不允許在GreetingManager類(lèi)的外面以賦值的方式訪(fǎng)問(wèn)。
聯(lián)系客服