第一回
Lambda表達式
本節原文http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_01/csharp30_01_01.html
C# 3.0 是什麼
C#也順利的進行了版本升級,變成3.0了。在連載開始之初,就當作是前言吧,簡單的介紹一下C# 3.0究竟是什麼。
C# 3.0,是運行時綁定的類型安全(似乎我們稱之為強類型)的面向對象(日語原文“object指向”)語言。運行時綁定(日語原文是“動的”),指的是程序運行時才能夠確定,類型安全,是指所有數據都是有類型的,或編譯的時候,或運行的時候,有嚴格的類型檢查。然後,面向對象是指數據與object為基礎的語言。
但是,這些調整是從C#2.0繼承而來的,並不是C# 3.0所特有的。作為C# 3.0所特有的特征是什麼呢?
根據筆者個人的印象,對於C# 3.0語言具有的各個機能的技術解說很多,但對於語言本身的說辭卻很少。例如,經常會見到“與其他語言相比,Java(或者Ruby)是那麼的優美”這樣的詞句。但是,關於C# 3.0的文章,大多是些個別技術內容及其使用的介紹,與其他語言相比較的文章,對語言優美性大家贊賞的文章卻很少遇見。
難道是C# 3.0沒人在用嗎?肯定不能這麼說。用C# 3.0 每天生產大量代碼的大有人在。筆者也是其中之一。
那麼為什麼他們不說呢?恐怕不問當事人就很難知道答案。但是,筆者不說的理由卻很簡單。技術人員,並不是說客,而是coder,是那種代碼寫的很爽覺睡得很爽就很滿足的人種。同時,用C# 3.0 沒壓力的(但是,寫這樣的隨筆的理由也很簡單。因為有一種人叫撰稿人,是說客。筆者,就是一個撰稿人,腳踏兩條船)。
這種情況暗示了一下問題:
世上,存在著不通過解說的強化就體現不出其優秀性的語言,也存在著不經過寫代碼的檢驗其優秀性不能被領會的語言。
這也意味著,C# 3.0的特征,不是通過言語的說明,而必須看見實實在在的代碼才能理解。而這代碼也不是那種寥寥幾行的sample code,必須是動真格的那種有一定規模的program(但是遺憾的是,這種篇幅的連載隨筆,也寫不下這樣的code。只能是用那種寥寥幾行的sample code來做說明,還望諒解)。
那麼,具體的用code來展現的C# 3.0的特征究竟是什麼呢?
我認為,那其實就是“排除了一切歧義(暧昧),使用嚴格的類型,用徹徹底底最少的文字來寫code”。
一個典型的例子,就是這次的主題“Lambda表達式”。Lambda表達式的內部機理,與C# 2.0 所具有的匿名方法沒什麼兩樣。有兩樣的地方,主要就是能夠以最少的文字數來寫代碼。
另一個c# 3.0的新機能“隱含類型變量”,同樣也是為了減少代碼數量。根據初始化值的來確定類型,又以前的代碼:
SpecialHighReadabilityTypeName<AnotherHighReadabilityTypeName>
這麼一長串變成了var三個字母(這個新機能將在後面的章節介紹)。
但是,代碼變短的效果是巨大的。首先,當然是手敲鍵盤的時間變短了。通過Visual Studio的IntelliSense的配合,輸入量大大減少(對於精力充沛的年輕人來說這可能不算什麼)。實現同樣的意圖,輸入量的減少就意味著產量的增加。
然而更好的一點就是,讀代碼的時間減少了。一屏顯示的文字數量和人眼能夠讀取的信息量都是有限的,同樣的編程意圖,用相對少的文字來表現的話,那麼能夠表示的信息量就多了。由於這一點,讀代碼時的翻頁頻度降低了,也排除了沒有什麼重要意義的關鍵字,用來分辨有意義代碼的的時間也減少了。
問題是,為了沒有歧義(暧昧),用更少的文字來表現同樣的編程意圖,而引入了新的語法,這就必須把這些個語法給記住。同時,雖然代碼短了,但因為是不熟悉的語法,閱讀源代碼並不見得變得簡單。
但這也不是什麼大問題。為什麼呢?C# 3.0 本來就是一個用來埋頭寫代碼的語言(我的理解是“C# 3.0不是僅僅用來讀的),C# 3.0的程序員就是大量代碼的制造者。在這大量的代碼制造過程中,這幾個個別的語法問題早就熟悉了。換句話說,C# 3.0就是通過寫大量代碼為目的而生的。
C# 3.0的適用范圍
本文一開始就提到了重要的一點。
C# 3.0以及作為其開發環境的Visual Studio 2008的適用范圍有多大呢。就是問,在什麼Framework上開發才能用它呢?
經常被誤解的,是存在這樣的認識,就是這些是.NET Framework 3.5專用的,在使用.NET Framework 2.0開發時仍然必須使用Visual Studio 2005和C# 2.0。
其實,這個認識是有誤解的(筆者最初也誤解)。.NET Framework 3.5 其實就是.NET Framework2.0+alpha,如果不使用“+alpha”的部分,Visual Studio 2008和C# 3.0開發的程序也能夠在.NET Framework 2.0上運行。
光說不練不行。讓我們看看怎麼做吧。Visual Studio 2008中打開工程的屬性,打開應用程序標簽頁,Framework的版本是有2.0、3.0、3.5可選的。
這裡,如果選.NET Framework 2.0,那麼用VS2008+C# 3.0就能開發.NET Framework 2.0的應用程序。實際上,筆者現在寫的程序,確實能夠滿足這樣的條件。
但是,有點要注意。如果這樣做,那麼有的機能能夠使用,有的就不能。Lambda表達式之類的語法上的新機能能夠使用,需要類庫支持的LINQ這類的新機能就不能用。一句話,就是不能使用所有的C# 3.0的所有機能。但是,僅是能夠使用的機能,對我們的幫助就很大。如果沒什麼大問題,.NET Framework 2.0的項目向VS2008+C# 3.0轉移是個不錯的選擇。
順便提一句,VS2008比VS2005更吃系統資源。如果系統資源緊張,還是別勉強轉VS2008了。機器強大的話,轉VS2008+C# 3.0價值還是蠻大的。