位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# 復(fù)習(xí)匿名方法

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

匿名方法是提供的內(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)型都要使用它。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部