文章目錄
- 擴充函數(Extension methods)
- 匿名運算式 (Lambda expressions)
- 對象和集合初始化 (Object and collection initializers)
- 匿名型別 (Anonymous types)
- 查詢運算式 (Query expressions)
C# 3.0 davies 發表於 2005-9-16 09:53 | 分類: Programming ::
剛DotNet版看到有人貼了C# 3.0 的介紹,大概翻了一下,有不少驚喜,C#中引入了很多其他指令碼語言的特性,越來越適合做快速開發,甚至原形開發。簡要概括如下:
隱式局部變數申明 (Implicitly typed local variables)
就像JavaScript中那樣 var i = 0, 以及 var s = "string" 等,它等效於 int i =0 和 string s="string" 。但不支援空類型,不支援動態類型,也不支援為初始化的隱士申明。這其實還是靜態類型,並沒有多大改善,只是在申明變數的時候,更"傻瓜"一點。像 Python這種完全動態類型的語言,使用起來非常爽,比如可以非常方便地將不同類型資料放在同一個數組或者集合中,但是會有不少潛在的問題,開發大型系統是就會不太合適。
擴充函數(Extension methods)
可以申明一個靜態函數,其第一個參數用this修飾,然後第一個參數類型的對象就可以把它當成員函數使用。比如有一個函數是 public static int Str2Int(this string s), 通常的使用方式是Str2Int("string")的樣子,但現在可以用 "string".Str2Int() 的文法形式。這一點跟Python或者Ruby等語言非常類似。
匿名運算式 (Lambda expressions)
在要寫一個非常小的函數暫時用時,還要去聲明一個函數就不太合適,而匿名函數就可以很好的解決這樣的問題,非常適合函數式的編程風格。C# 3.0 裡也支援匿名運算式了,使用 => 操作符,左邊是參數列表,右邊是函數體,將一個函數在一行內完成。比如 x => x+1,相當於函數 int func(int x) { return x+1;},顯然前者非常簡潔直觀。用匿名函數來操作資料集非常方便,比如 filter( list, x => x>5 ) 就可以把list中大於5的數提取出來。匿名函數在 Python 和 List等語言中都支援得很好。C# 中的匿名函數是delegate的延伸,它也是強型別的,比如定義Func<double, int> f = x => x + 1; 就是錯的。
對象和集合初始化 (Object and collection initializers)
對象的初始化時可以顯示地指明參數列表,比如 Point p = new Point{ X = 1, Y = 2}; ,這樣寫出來的代碼可讀性非常強。但不知道函數調用時能不能這樣給參數賦值,在Python中是可以的。比如一個函數有10個參數,且都是可選的。加入我想給最後一個參數設定一個非預設值,若在C++中就必須把所與參數都提供,並且前面的9個都得是預設值。而在Python中,就可以在參數列表中直接指定給某個參數傳遞某個值,比如 open_html_page("http://blog.daviesliu.net/", proxy = "proxy.rainbud.net")。數組可以用列表的方式初始化,比如 List<int> list = new List<int> {1,2,3,4};
匿名型別 (Anonymous types)
類中的成員變數也可以是隱式申明的,在申明類時不用指定類型,其類型由初始化時的參數類型決定。這其實就相當於C++中的模版,每一個成員變數都有一個參數類型,當給定某種類型來得到執行個體時,就會執行個體化一個符合這種類型的類。這可以說是 C# 2.0 支援範型編程之後的又一次提升。C# 2.0 中的範型集合類叫 Generic Collections,比如上面舉例所用的List<>。據說這種模版效率很高,甚至List<int>要高過自己實現的 IntList。
查詢運算式 (Query expressions)
這是C# 3.0 非常有創意的一個地方,居然把查詢資料庫用的SQL文法繼承到進階程式設計語言中來,這樣以後開發資料庫程式一定非常方便,有可能操作資料庫就像操作本地變數一樣方便。使用了 from where oderby select 等關鍵字。比如 from C in customers orderby C.Name where C.City="Beijing" select new { C.Name, C.Age } 就可以賽選出將在北京的客戶,並按照名字排序,結果中只有名字和年齡兩個欄位。這樣編程,是非常Cool的,不知道效能怎麼樣,應該不低。
C# 2.0 似乎還沒有正式發布,居然 3.0 的規範就出來了,而且還有不少亮點,值得期待。可以看出,C# 3.0 借鑒了不少指令碼語言的特點,比如Python,或許微軟從開源社區挖來了不少高手來設計C#。