C# 3.0 隨 .NET Framework 3.5 發布,引入了五項顛覆性語言特性,徹底改變了開發者編寫數據訪問、對象構建與函數式邏輯的方式。本文系統梳理這五大支柱:隱式類型區域變量、擴展方法、對象初始化器、匿名類型、LINQ (Language Integrated Query)。
var)var 允許聲明變量時省略顯式類型,由編譯器根據初始化表達式靜態推斷。關鍵特性:
var s = "hello"; s = 123; 編譯失敗(類型錯誤)。var x; 或 var x = null; 均報錯。var cust = new Customer(); 替代 Customer cust = new Customer();。GetByName() 返回類型從 Customer 改為 Person,調用端 var c = GetByName("Zach"); 無需修改。打破「無法為 sealed 類型或第三方類型添加實例方法」的限制。核心規則:
static 類中,方法本身為 static。this 指定擴展目標類型(如 this string data)。using 引入命名空間後方可調用(如 data.NoSpaces())。// 定義擴展方法
namespace MyExtensionMethods
{
public static class Extension
{
public static string NoSpaces(this string data)
{
return data.Replace(" ", "");
}
}
}
// 使用
using MyExtensionMethods;
string input = "this is my data";
string result = input.NoSpaces(); // "thisismydata"
消除「為每種屬性組合編寫構造函數」的痛苦,實現聲明式初始化:
// C# 2.0 需多構造函數
Customer c = new Customer("Zach", "Smith");
// C# 3.0 單一無參構造函數即可
Customer c = new Customer { FirstName = "Zach", LastName = "Smith" };
可讀性提升:new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 } 遠優於 new Car(18, 10, 550)。
// C# 2.0
List list = new List();
list.Add("monkey"); list.Add("donkey"); ...
// C# 3.0
List list = new List { "monkey", "donkey", "cow", "dog", "cat" };
結合 var 與對象初始化器,無需預先定義類即可創建臨時數據結構:
var point = new { X = 10, Y = 20 }; // 編譯器自動生成唯讀屬性類型
Console.WriteLine(point.X); // 10
// 同結構匿名類型共享底層類型
var p1 = new { Name = "A", Age = 1 };
var p2 = new { Name = "B", Age = 2 };
p1 = p2; // 合法,結構相同
作用域遵循普通變量規則;廣泛用於 LINQ 投影(select new { ... })。
統一了對內存集合、XML、數據庫等異構數據源的查詢語法,消除「SQL 字符串拼接 + 手工映射」的痛苦:
List customers = GetCustomers();
var query = from c in customers
where c.OrderCount > 10
orderby c.ID
select c;
// 等價方法語法(Lambda)
var query = customers
.Where(c => c.OrderCount > 10)
.OrderBy(c => c.ID);
LINQ 為後續並行查詢 (PLINQ)、異步流 等現代特性奠定了基礎。
這五大特性相輔相成:var 與匿名類型解決「臨時類型無法聲明」難題;擴展方法為 LINQ 提供 Where/Select 等查詢算子;對象/集合初始化器簡化數據構建;Lambda 表達式(隱含在查詢中)賦予函數式表達能力。C# 3.0 標誌著 C# 從純命令式語言向聲明式、函數式混合範式的關鍵轉型。