C# 3.0 作為一門面向對象、類型安全、運行於 CLR 之上的語言,在保持簡單易學的同時,通過語法糖大幅提升表達力。本文基於《C# 3.0 in a Nutshell, 3rd Edition》梳理核心知識體系。
System.Object,擁有 ToString()/Equals() 等方法。var 的本質C# 為強類型語言:編譯期強制類型檢查,IntelliSense 提前發現錯誤。var 並非弱化類型系統——編譯器根據上下文推斷靜態類型,IL 中為具體類型,零運行時開銷。
IDisposable 及時釋放非託管資源(using 模式)。| 特性 | 關鍵字/語法 | 核心價值 |
|---|---|---|
| LINQ | from/select/where/orderby/group | 統一查詢語法,編譯期檢查,自動映射 |
| Lambda 表達式 | => | 匿名函數簡潔語法,支持表達式樹 |
| 擴展方法 | this 修飾首參數 | 為現有類型(含 sealed/介面)注入實例方法 |
| 隱式類型變量 | var | 編譯期靜態類型推斷,簡化冗長泛型聲明 |
| 查詢理解語法 | from...select | LINQ 的聲明式查詢語法糖 |
| 匿名類型 | new { Prop = val } | 臨時數據結構,配合 var/LINQ 投影使用 |
| 對象初始化器 | new T { P1=v1, P2=v2 } | 聲明式初始化,消除構造函數爆炸 |
| 隱式類型數組 | new[] { ... } | 數組類型推斷,配合匿名類型數組 |
| 自動屬性 | public int X { get; set; } | 編譯器自動生成 backing field,減少樣板代碼 |
| 部分方法 | partial void M() | 代碼生成器預留擴展點,無實現則編譯移除 |
| 表達式樹 | Expression<T> | 將 Lambda 表示為數據結構,支撐 IQueryable 遠端轉譯 |
// C# 3.0
public class Stock {
public decimal Price { get; set; } // 編譯器生成私有字段
}
// C# 2.0 等價
public class Stock {
private decimal _price;
public decimal Price {
get { return _price; }
set { _price = value; }
}
}
partial class PaymentForm {
partial void ValidatePayment(decimal amount); // 聲明(可無實現)
}
partial class PaymentForm {
partial void ValidatePayment(decimal amount) { // 可選實現
if (amount > 100) throw new Exception("超額");
}
}
// 調用:無實現時編譯器移除調用點,零開銷
PaymentForm form = new PaymentForm();
form.ValidatePayment(5.3); // 安全調用
// 委托:可執行代碼
Func square = x => x * x;
Console.WriteLine(square(3)); // 9
// 表達式樹:數據結構(AST)
Expression> expr = x => x * x;
// 可運行時分析/修改/轉譯為 SQL
var body = expr.Body; // BinaryExpression: x * x
上述所有新特性業內統稱「語法糖」——不擴展 CLR 能力,純編譯器層面轉換。這意味著:
C# 3.0 以 LINQ 為核心,配套 9 項語言特性,完成了從命令式到聲明式/函數式混合範式的跨越。理解其「編譯期轉換」本質,有助於在遷移 .NET Core/.NET 5+ 時平滑升級代碼庫。