首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

LINQ 演進史與 C# 語言設計影響:從序列運算子到查詢運算式的完整演變

     編輯:關於C#

LINQ 概觀

LINQ (Language Integrated Query) 是 C# 3.0 (VS 2008 "Orcas") 引入的語言層級查詢功能,支援 XML (LINQ to XML)、資料庫 (LINQ to SQL/Entities/DataSet)、記憶體物件 (LINQ to Objects) 等多種資料源。

LINQ 架構圖

早期設計構想:序列運算子

Anders Hejlsberg 最初構想「序列運算子」作為擴充方法:

// 理想語法
sequence locals = customers.where(ZipCode == 98112);

但 C# 2.0 僅支援匿名方法,語法冗長:

IEnumerable locals = EnumerableExtensions.Where(customers, 
    delegate(Customer c) { return c.ZipCode == 98112; });

關鍵語言特性演進

1. Lambda 運算式 (Lambda Expressions)

簡潔的匿名函式語法,支援型別推論:

// C# 3.0
var locals = customers.Where(c => c.ZipCode == 98112);
  • => 運算子分隔參數與主體。
  • 參數型別由委派簽名推論 (Func<Customer, bool>)。
  • 支援變數捕獲 (Closure) 多重語句主體。

2. 擴充方法 (Extension Methods)

靜態方法以 this 修飾第一個參數,可用實例語法呼叫:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
  • 讓介面無需修改即可「擴充」方法。
  • 透過 using 引入命名空間啟用。
  • 應用案例:簡化介面實作 (如 IDog.Bark() 預設 2 秒)。

3. 匿名型別

投影多欄位時無需預先定義類別:

var locals = customers.Select(c => new { c.Name, c.Address });
// 編譯器隱式產生 class { public string Name; public string Address; }
  • 欄位名可自訂:new { FullName = c.First + " " + c.Last }。
  • 型別無名稱,需搭配 var 使用。

4. 隱式型別區域變數

var i = 1; // 編譯器推論為 int
var dict = new Dictionary<string, List<Customer>>(); // 簡化泛型宣告

強型別:var 非動態型別,編譯期確定,不可變更。

5. 物件初始化設定式

var c = new Customer { Name = "Roger", Address = "1 Wilco Way" };
// 等同於 new Customer() { Name = "...", Address = "..." },可省略 ()

解決無對應建構函式時的屬性指派問題。

查詢運算式:貼近 SQL 的語法糖

易用性研究顯示開發者偏好 SQL 風格,設計團隊加入查詢運算式:

var locals = from c in customers
             where c.ZipCode == 98112
             select new { FullName = c.FirstName + " " + c.LastName, 
                          HomeAddress = c.Address };

編譯器完全轉換為方法呼叫鏈:

var locals = customers
    .Where(c => c.ZipCode == 98112)
    .Select(c => new { FullName = c.FirstName + " " + c.LastName, 
                       HomeAddress = c.Address });

支援子句

  • from, where, select, orderby, group by, let, join
  • 可與擴充方法混用:(from ... select ...).Count()

總結

LINQ 語法歷經多年演進:序列運算子構想 → Lambda → 擴充方法 → 匿名型別 → var → 物件初始化 → 查詢運算式。每項特性獨立實用,組合成強大的整合式查詢平台,讓 C# 成為同時擁有強型別與聲明式查詢能力的語言。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved