coffees = ["French Roast", "Columbian", "Kona"];//這不是初始化,而是賦值。
對象初始化表達式是語言集成查詢的一個重要功能,因為它們允許在僅允許表達式的上下文(如 λ 表達式和表達式樹)中生成新的結構化值。
5. Anonymous types
C# 3.0 permits the new operator to be used with an anonymous object initializer to create an object of an anonymous type.
霍霍,implicitly typed local variables + object initializer = anonymous types!
LINQ 項目支持以數據為中心的編程樣式,其中,某些類型的存在主要是為了通過結構化值提供靜態“形式”,而不是提供同時具有狀態和行為的完整對象!涿愋驮试S將新的結構定義為與它們的初始化進行“內聯”。
6. Implicitly typed arrays
The syntax of array creation expressions (§7.5.10.2) is extended to support implicitly typed array creation expressions.
implicitly typed local variables + collection initializer = Implicitly typed arrays
7. Query expressions
Query expressions provide a language integrated syntax for queries that is similar to relational and hierarchical query languages such as SQL and XQuery.
The C# 3.0 language does not specify the exact execution semantics of query expressions. Rather, C# 3.0 translates query expressions into invocations of methods that adhere to the query expression pattern. Specifically, query expressions are translated into invocations of methods named Where, Select, SelectMany, Join, GroupJoin, OrderBy, OrderByDescending, ThenBy, ThenByDescending, GroupBy, and Cast that are expected to have particular signatures and result types.
C#引入了很多語言構造來支持特定的操作。比如foreach語句、using語句等,在支持函數回調的語言中,這些語句的功能都可以用函數來模擬,C++ STL中就有for_each函數。
C#3.0的Query expressions應該也是這類語言構造。乍一看,貌似可以在C#中寫類似SQL的查詢語句來從對象中提取信息了——把查詢語句寫在字符串中并不稀奇,C#3.0的厲害之處在于,它把查詢語句提升為語言級別的構造。至于實現原理,似乎與C語言的宏有神似之處,編譯器在類型綁定和重載決策之前,把查詢表達式翻譯為相應的方法調用。比如下面的查詢表達式
from c in customers group c by c.Country into g select new { Country = g.Key, CustCount = g.Count() }
將被翻譯為
customers. GroupBy(c => c.Country). Select(g => new { Country = g.Key, CustCount = g.Count() })
顯然,為了支持查詢表達式,customers所在的類型必須包含GroupBy,Select等方法(pzy:這種方法稱為“查詢操作符”,引入擴展方法的主要意圖就是讓用戶可以定義查詢操作符。)的定義。
從查詢表達式到方法調用的翻譯,是在語法層面上,于是我感覺,之前的一堆功能,動機都是簡化、統一、兼容語法,它們在一定程度上是為查詢表達式服務的。比如擴展方法,就是為了能夠以與實例方法相同的語法調用在其它類中定義的靜態方法。
與 foreach 語句一樣,查詢語法是一個方便的聲明性代碼縮寫,您可以手動編寫它。
8. Expression trees
Expression trees permit lambda expressions to be represented as data structures instead of executable code.
把代碼封裝為數據?還沒領會它的真正意圖是什么,好像也是為查詢表達式服務的。
λ 表達式的優點是,能夠提供最直接而簡潔的創作語法。更重要的是,λ 表達式可以編譯為代碼,也可以編譯為數據,從而允許優化器、轉換器和計算器在運行時處理 λ 表達式。表達式樹是 λ 表達式的有效內存中數據表示形式,它使表達式的結構透明且顯式。
編譯器是發出可執行 IL 還是表達式樹取決于 λ 表達式的用法。如果將 λ 表達式指定給委托類型的變量、字段或參數,則編譯器將發出與匿名方法等效的 IL。如果將 λ 表達式指定給 Expression 類型的變量、字段或參數,則編譯器將發出表達式樹。
例如,請考慮以下兩個變量聲明:
Func f = n => n < 5; Expression e = n => n < 5;
變量 f 是對委托的引用,可以直接執行:
bool isSmall = f(2); // isSmall is now true
文章來源于領測軟件測試網 http://www.kjueaiud.com/