1. 程式人生 > >泛型約束及lambda表示式,表示式樹

泛型約束及lambda表示式,表示式樹

泛型前面說概念比較簡單而且說過了,分型限制指的是對於他的泛型引數進行一個設定。一般程式碼可以嘗試使用與客戶端使用的特定型別實參不相容的一般型別引數的方法、屬性或成員。這是不可接受的,因為它相當於缺少型別安全。在 C# 中,您需要通知編譯器客戶端指定的型別必須遵守哪些約束,以便使它們能夠取代一般型別引數而得到使用。

csdn上:

在定義泛型類時,可以對客戶端程式碼能夠在例項化類時用於型別引數的型別種類施加限制。 如果客戶端程式碼嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。 約束是使用 where 上下文關鍵字指定的。 下表列出了六種型別的約束:

約束

說明

T:類

型別引數必須是引用型別;這一點也適用於任何類、介面、委託或陣列型別。

T:new()

型別引數必須具有無引數的公共建構函式。 當與其他約束一起使用時,new() 約束必須最後指定。

T:<基類名>

型別引數必須是指定的基類或派生自指定的基類。

T:<介面名稱>

型別引數必須是指定的介面或實現指定的介面。 可以指定多個介面約束。 約束介面也可以是泛型的。

T:U

為 T 提供的型別引數必須是為 U 提供的引數或派生自為 U 提供的引數。


其實也就是這樣而已,為了增加安全,同時也讓你自己多一些規範。

new 約束指定泛型類宣告中的任何型別引數都必須有公共的無引數建構函式。當與其他約束一起使用時,new() 約束必須最後指定。

在應用 where T : class 約束時,避免對型別引數使用 == 和 != 運算子,因為這些運算子僅測試引用同一性而不測試值相等性。 即使在用作引數的型別中過載這些運算子也是如此。


現在說下lambda,其實就是一個簡化的表示式而已:

Lambda 表示式是一種可用於建立委託表示式目錄樹型別的匿名函式。 通過使用 lambda 表示式,可以寫入可作為引數傳遞或作為函式呼叫值返回的本地函式。 Lambda 表示式對於編寫 LINQ 查詢表示式特別有用。

若要建立 Lambda 表示式,需要在 Lambda 運算子 => 左側指定輸入引數(如果有),然後在另一側輸入表示式或語句塊。 例如,lambda 表示式 x => x * x 指定名為 x 的引數並返回 x 的平方值。 

詳細見:http://msdn.microsoft.com/zh-cn/library/bb397687.aspx 

然後對於表示式樹,其實就是一個樹結構,對應的節點為運算式。還是直接看比較好說: