天天看點

編寫高品質代碼改善C#程式的157個建議[為泛型指定初始值、使用委托聲明、使用Lambda替代方法和匿名方法]

前言

  泛型并不是C#語言一開始就帶有的特性,而是在FCL2.0之後實作的新功能。基于泛型,我們得以将類型參數化,以便更大範圍地進行代碼複用。同時,它減少了泛型類及泛型方法中的轉型,確定了類型安全。委托本身是一種引用類型,它儲存的也是托管堆中對象的引用,隻不過這個引用比較特殊,它是對方法的引用。事件本身也是委托,它是委托組,C#中提供了關鍵字event來對事件進行特别區分。一旦我們開始編寫稍微複雜的C#代碼,就肯定離不開泛型、委托和事件。本章将針對這三個方面進行說明。

  建議35、使用default為泛型類型指定初始值

  建議36、使用FCL中的委托聲明

  建議37、使用lambda表達式代替方法和匿名方法

建議35、使用default為泛型類型指定初始值

  有些算法,比如泛型集合List<T>的Find算法,所查找的對象有可能會是值類型,也有可能是引用類型。在這種算法内部,我們常常會為這些值類型變量或引用類型變量指定預設值。于是,問題來了:值類型變來那個的預設初始值是0值,而引用類型變量的預設初始值是null值,顯然,這會導緻下面編譯出錯:

編寫高品質代碼改善C#程式的157個建議[為泛型指定初始值、使用委托聲明、使用Lambda替代方法和匿名方法]
編寫高品質代碼改善C#程式的157個建議[為泛型指定初始值、使用委托聲明、使用Lambda替代方法和匿名方法]

C#編譯器會阻止這樣的代碼通過編譯。要讓編譯器接收為一個泛型類型參數指定一個初始值,最妥當的辦法就是使用default關鍵字。是以,在上面的代碼應該改為:

這樣如果它在運作時碰到的T是一個整型,那麼運作時會為其指派0;如果T在運作時是一個Person這樣的引用類型,則會為其賦null值。

建議36、使用FCL中的委托聲明

 要注意FCL中存在三類這樣的委托聲明,他們分别是:Action、Func、Predicate。尤其是在他們的泛型版本出來以後,已經能夠滿足我們在實際編碼過程中的大部分需要。

除了Action、Func、Predicate外,FCL中還有用于辨別特殊含義的委托聲明。如用于表示注冊事件方法的委托聲明:

表示線程的委托聲明:

表示異步回調的委托聲明:

在FCL中沒一類委托聲明都代表一類特殊的用途,雖然可以使用自己的委托聲明來代替,但是這樣做不僅沒有必要,而且會讓代碼失去簡潔性和标準型。在我們實作自己的委托聲明前,應該首先檢視MSDN,确信有必要之後才這樣做。

建議37、使用lambda表達式代替方法和匿名方法

首先我們使用Action和Func來做一個簡單的小例子,控制台應用程式代碼如下所示:

第一個版本

實際上要完成上面的功能,還有多種編碼方式,先來看一種最中規中矩的方式,同時也是最繁瑣的寫法:

第二個版本

其實也就是将第一個版本稍作調整。從上面的寫法中也可以看出:Add方法和Print方法實際上都隻有一條語句,是以,使用匿名方法也許是一種更好的選擇:

第三個版本

使用匿名方法以後,我們不需要在Main方法外部聲明兩個方法了,可以直接在Main這個工作方法中完成所有的代碼編寫,而且不會影響代碼清晰性。實際上,所有代碼行數不超過3行的方法(條件是它不倍重用),我們都建議采用這種方式來編寫。上面的版本繼續改進:

第四個版本

以上代碼看上去更簡化了,不過,最終極的改進是使用lambda表達式:

第五個版本

Lambda表達式操作符”=>“的左側是方法的參數,右側是方法體,其本質是匿名方法。實際上,經過編譯後Lambda表達式就是一個匿名方法。我們應該在實際的編碼工作中熟練運用它,避免寫出繁瑣且不美觀的代碼。

英語小貼士

1、Your passport and declaration card, please.——請出示護照和申報單。

2、This is a souvenir that I'm taking to Taiwan.——這是我要帶去台灣的當地紀念品。

3、Do you have anything to declare?——是否有任何東西需要申報?

4、Do you have any liquor or cigarettes?——你有攜帶任何酒類或香煙嗎?   No, I don't.——沒有。

5、Yes, I have two bottles of whisky.——是的,我帶了兩瓶酒。

6、Please open this bag.——請打開這個袋子。

7、The camera is for my personal use.——這個相機是我私人使用的。

8、What are these?——這些東西是做何用?

9、You'll have to pay duty on this.——你必須為這項物品繳付稅金。

10、These are for my personal use.——這些是我私人使用的東西。

11、Do you have any other baggage?——你還有其它行李嗎?

12、These are gifts for my friends.——這些是給朋友的禮物。

13、O.K. Please give this declaration card to that officer at the exit.——好了!請将這張申報卡交給出口處的官員。

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

繼續閱讀