C# 復(fù)習(xí)匿名方法
匿名方法是提供的內(nèi)聯(lián)(inline)方法,否則就需要使用委托類(lèi)型的變量。給事件添加處理程序時(shí),過(guò)程如下:
(1)定義一個(gè)事件處理方法,其返回類(lèi)型和參數(shù)匹配要訂閱的事件需要的委托的返回類(lèi)型和參數(shù)。
(2)聲明一個(gè)委托類(lèi)型的變量,用于事件。
(3)把委托變量初始化為委托類(lèi)型的實(shí)例,該實(shí)例指向事件處理方法。
(4)把委托變量添加到事件的訂閱者列表中。
實(shí)際上,這個(gè)過(guò)程會(huì)比上述簡(jiǎn)單一些,因?yàn)橐话悴皇褂米兞縼?lái)存儲(chǔ)委托,只在訂閱事件時(shí)使用委托的一個(gè)實(shí)例。
前面使用的代碼就屬于這種情況,如下所示:
Timer myTimer = new Timer(100);
myTimer.Elapsed += new ElapsedEventHandler(WriteChar);
這段代碼訂閱了 Timer對(duì)象的Elapsed事件。這個(gè)事件使用委托類(lèi)型ElapsedEventHandler,使用方法標(biāo)識(shí)符WriteChar實(shí)例化該委托類(lèi)型。結(jié)果是Timer對(duì)象引發(fā)Elapsed事件時(shí),就調(diào)用方法WriteChar()。傳遞給 WriteChar()的參數(shù)取決于由ElapsedEventHandler委托定義的參數(shù)類(lèi)型和Timer中引發(fā)事件的代碼傳遞的值。
實(shí)際上,C#編譯器可以通過(guò)方法組語(yǔ)法,用更少的代碼獲得相同的結(jié)果:
myTimer.Elapsed += WriteChar;
C#編譯器知道Elapsed事件需要的委托類(lèi)型,所以可以填充該類(lèi)型。但大多數(shù)情況下,最好不要這么做,因?yàn)檫@會(huì)使代碼更難理解,也不清楚會(huì)發(fā)生什么。使用匿名方法時(shí),該過(guò)程會(huì)減少為“一步”:
(1)使用內(nèi)聯(lián)的匿名方法,該匿名方法的返回類(lèi)型和參數(shù)匹配所訂閱事件需要的委托的返回類(lèi)型和參數(shù)。用delegate關(guān)鍵字定義內(nèi)聯(lián)的匿名方法:
myTimer.Elapsed +=
delegate(object source, ElapsedEventArgs e)
{
WriteLine("Event handler called after {0} milliseconds.",
(source as Timer).Interval);
};
這段代碼像單獨(dú)使用事件處理程序一樣正常工作。主要區(qū)別是這里使用的匿名方法對(duì)于其余代碼而言實(shí)際上是隱藏的。例如,不能在應(yīng)用程序的其他地方重用這個(gè)事件處理程序。另外,為更好地加以描述,這里使用的語(yǔ)法有點(diǎn)沉悶。delegate關(guān)鍵字會(huì)帶來(lái)混淆,因?yàn)樗哂须p重含義——匿名方法和定義委托類(lèi)型都要使用它。
點(diǎn)擊加載更多評(píng)論>>