昨天忙了一個晚上,終於發布了新的BETA 1.5。叫BETA 1.5而不是BETA2的原因是我覺得這次發布比較倉卒,品質恐怕還到不了叫BETA2的程度。但是這次更新帶來的新特性還是比較多的。下載頁面:
http://sourceforge.net/project/showfiles.php?group_id=148613
首先給不熟悉VBF的人簡單介紹一下VBF:VBF是一個.NET下的函數式編程類庫,提供了建立函數式演算法邏輯的基本架構,還提供了一個使用組合子和高階函數來建立新函數的體系。使用VBF可以實現物件查詢、詞法解析以及順延強制邏輯的許多程式。這個版本提供的新功能主要包括:
1、Nullable的支援和IsNull判定
這次提供了對.NET Framework 2.0中Nullable Type的支援,即支援返回Nullalbe<T>類型的函數子(Functor)使用定義在T上的四則運算或比較子。對C#而言,這是一個非常方便的特性。比如我們有個一System.Collections.Generic.List<int?>類型的列表list1,下面的代碼示範了如何從中查詢到所有小於0或者為空白的項: //C#
//定義一個Identity對象用於查詢
Identity<int?> IdNInt = new Identity<int?>();
List<int?> result = list1.FindAll(IdNInt.IsNull() || IdNInt < 0);
如你所見,現在可以使用捷徑運算子||和&&了,這也是本版本一個新增功能。另一個新增功能:IsNull()返回一個函數用於判斷當前項是否為空白。
2、元組(Tuple)和多元函數支援
現在VBF通過對Tuple的支援,提供了處理二元函數及三元函數的能力。Tuple是一種唯讀結構體,其每個欄位的類型均由型別參數指定。因此使用Tuple,你可以快速建立出滿足你要求的小型結構。 'VB
'示範產生一個Tuple
Dim t1 As Tuple(Of Integer, String) = Values(12, "Hello World")
Dim t2 As Tuple(Of Long, Single, Date) = _
Values(100L, -58.8, Now())
Values函數自動產生一個相應類型的Tuple,當前Tuple最多支援5個型別參數。Tuple用於類比多元函數的參數表,還可以作為查詢的臨時返回量。
3、屬性訪問文法
這是本版本極其重要的一個功能,有了他,就可以在Id型查詢中訪問被查詢對象的屬性。我們先看一個例子。假設Employee類型有兩個屬性——整數型的Age和字串型的Name。如果我們有一個System.Collections.Generic.List<Employee>類型的列表emplist,現在要找到所有Age大於25的Employee對象,該如何寫呢?VBF提供了獨特的!文法(僅支援VB)和Satisfies滿足條件方法:
'VB
'Employee是一個有Age和Name屬性的類型
'emplist是一個裝有Employee執行個體的List(Of Employee)
'定義Identity對象用於查詢
Dim IdEmp As New Identity(Of Employee)
result = emplist.FindAll(IdEmp!Age.Satisfies(IdInt > 25))
注意!Age文法,它提供了對Age的訪問,但無法得知Age的類型。因此需要在Satisfies函數後面用強型別的IdInt指明要查詢的Age是Integer類型。這條查詢語句可以讀作“尋找Employee,它的Age屬性滿足整數大於25”。這已經是我找到的最具可讀性的寫法。除了Satisfies滿足條件方法,還支援直接取得屬性值的功能。比如我們要的到另一個List(Of String),是剛才那個Employee集合中所有項目Name屬性群組成的集合,可以這樣寫: 'VB
'接上段代碼
Dim names As List(Of String) = _
emplist.ConvertAll(Of String)(IdEmp!Name.AsType(Of String))
AsType方法表明了你要訪問的屬性的真實類型,這裡不支援任何協變。比如上述文法如果你是用Of Object就會運行錯誤。C#不支援!運算子,我在C#中採用了indexer的文法,即使用方括弧來訪問想要的屬性: //C#
Identity<Employee> IdEmp = new Identity<Employee>();
result = emplist.FindAll(IdEmp["Age"].Satisfies(Identities.IdInt > 25));
4、順延強制
現在VBF的每一個函數子物件(Functor)都支援一個DelayInoke的函數,它能返回一個IDelayInvoke(Of TReturn)的介面。使用DelayInvoke可以延遲函數的真實求值過程,直到真正使用函數傳回值的時候才開始計算。順延強制可以用來實現Command模式以及Undo/Redo功能。
VBF 1.5還提供了許多其它的新功能,比如用於String型函數的IndexOf方法支援、一元正負運算子支援、類型轉換函式支援等等。有興趣的可以直接下載原始碼觀看。很抱歉的是這次時間仍然較緊張,我還是沒有提供文檔,如果發現很難看懂我建議從Functor(Of TArg, TReturn)這個類的虛函數開始看起。希望大家多多提出建議,以便在VBF中提供更多新酷功能。