天天看點

編寫高品質代碼改善C#程式的157個建議[C#閉包的陷阱、委托、事件、事件模型]

前言

  建議38、小心閉包中的陷阱

  建議39、了解委托的實質

  建議40、使用event關鍵字對委托施加保護

  建議41、實作标準的事件模型

建議38、小心閉包中的陷阱

  首先我們先來看一段代碼:

你設想的結果或許是0,1,2,3,4

但沒想到執行後結果如下

編寫高品質代碼改善C#程式的157個建議[C#閉包的陷阱、委托、事件、事件模型]

通過IL可以檢視代碼,組合後大緻代碼如下:

當然運作後結果還是5,5,5,5,5

其實這段代碼所示範的就是一個閉包對象。所謂的閉包對象,指的是上面這種情形中的TempClass對象,如果匿名方法(Lambda表達式)引用了某個局部變量,編譯器就會自動将該引用提升到該閉包對象中,即将for循環中的變量i修改成了引用閉包對象的公共變量i。這樣一來,即使代碼執行後離開了原局部變量i的作用域(如for循環),包含該閉包對象的作用域也還存在。

下面簡單修改一下之前的代碼

執行結果如下:

編寫高品質代碼改善C#程式的157個建議[C#閉包的陷阱、委托、事件、事件模型]

建議39、了解委托的實質

 了解委托需要把握兩個點:

1、委托是方法指針。

2、委托就是一個類。當對其進行執行個體化的時候,要将引用方法作為它構造函數的參數。

建議40、使用event關鍵字對委托施加保護

建議41、實作标準的事件模型

我們應該知道微軟為事件模型設定的幾個規範:

1、委托類型的名稱以EventHandler結束。

2、委托原型傳回值為void。

3、委托原型具有兩個參數:sender表示事件觸發者,e表示事件參數。

4、事件參數的名稱以EventArgs結束。

最終進行調用的代碼如下:

英語小貼士

1、Hello. This is United Airlines.——聯合航空,您好。  I'd like to reconfirm my flight.——我想要再确認班機。

2、What's your name and flight number?——請說您的大名與班機号碼?  

3、My name is Jerry Cheng, and the flight number is UA 003 for Los Angeles.——我的名字是傑瑞‧陳,班機号碼是飛往洛杉機的聯合航空003班機。

4、When is it?June 10th.——行程是那一天?6月10日。

5、I'd like to make sure of the time it leaves.——我想要确認班機時間沒有改變。

6、I can't find your name. Really?——我找不到您的大名。真的?  May I have your name again?——請再告訴我一次您的大名?

7、I still can't find your name on the reservation list.——我仍然無法在訂位名單中找到您的名字。

8、Anyway, we have seats for new bookings on this flight. No problem.——别擔心,這班班機仍有空位提供新的訂位者。

9、One economy class seat, is that right?——一個經濟艙座位,對嗎?  Now you have been booked.——沒問題,您已完成訂位。

10、Thanks a lot. What time do you start check-in?——謝謝。你們何時開始辦理登機?

11、Two hours before departure time.——起飛前2小時。  You must check-in at least one hour before.——你必須在至少1小時前辦理登機。

感謝您的閱讀,如果您對我的部落格所講述的内容有興趣,那不妨點個推薦吧,謝謝支援:-O。