隨 VS 2005/C# 2.0 發布,微軟在 PDC 釋出 C# 3.0 預覽版,引入七大核心特性。雖未標準化,但已展現語言演進方向。本文系統梳理全部特性與代碼示例。
var)var)核心規則:編譯期根據初始化表達式靜態推斷類型,強類型不可變。
var i = 1; // int
var arr = new[] {1,2,3,4}; // int[]
// 必須同行初始化,不可為 null
// var x; // 錯誤
// var y = null; // 錯誤
關鍵作用:使匿名類型實例可賦值給強類型變量,無需預定義類型。
內聯定義唯讀屬性結構,編譯器自動生成類型(同結構共享類型):
var frankenstein = new { hair="black", skin="green", teethCount=64 };
// 編譯器生成類似:
class __Anonymous1 {
public string hair { get; set; }
public string skin { get; set; }
public int teethCount { get; set; }
}
// 同結構實例可互換
var a = new { X=1, Y=2 };
var b = new { X=3, Y=4 };
a = b; // 合法
定義於 static 類,首參數加 this,經 using 引入後如實例方法調用:
public static class StringExtensions {
public static int ToInt32(this string s) => Convert.ToInt32(s);
}
// 使用
using MyExtensions;
string s = "123";
int i = s.ToInt32(); // 編譯為 StringExtensions.ToInt32(s)
// 優先級低於實例方法
聲明式初始化,等價於無參構造 + 屬性賦值:
// 對象
var coord = new CoOrdinate { x = 0, y = 0 }; // 無需構造函數
// 集合
List animals = new List { "monkey", "donkey", "cow" };
// 等價於 Add 多次調用
語法:參數 => 表達式/語句塊。超越匿名方法:
Expression<T>),支撐遠端查詢轉譯。// 委托調用演進
// C# 1.x: 命名方法
delegate void D(); D d = SayHi; d();
// C# 2.0: 匿名方法
D d = delegate() { Console.WriteLine("Hi"); }; d();
// C# 3.0: Lambda
D d = () => Console.WriteLine("Hi"); d();
// 帶參數/返回值
Func sq = x => x * x; // 表達式體
Func add = (a, b) => { return a + b; }; // 語句體
SQL 風格語法糖,編譯為方法鏈 + Lambda:
var filtered = from c in coords
where c.x == 1
select new { c.x, c.y };
// 編譯器轉換為:
var filtered = coords.Where(c => c.x == 1)
.Select(c => new { c.x, c.y });
綜合運用:匿名類型(投影)、擴展方法(Where/Select)、var(結果類型)、Lambda(謂詞)。
Expression<T> 將 Lambda 表示為運行時可檢查/修改的 AST:
Expression expr = () => Console.WriteLine("Hi");
// 運行時分析樹結構
Console.WriteLine(expr.NodeType); // ExpressionType.Lambda
// 支撐 IQueryable: LINQ to SQL 將表達式樹轉譯為 SQL
C# 3.0 七大特性環環相扣:var/匿名類型解決中間類型聲明;初始化器簡化構建;擴展方法為 IEnumerable<T> 注入算子;Lambda 提供內聯邏輯;查詢表達式統一語法;表達式樹支撐遠端執行。這套組合拳奠定了現代 C# 生態(Entity Framework、Rx、ASP.NET Core 等)的基石。