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