C# 3.0 / .NET 3.5 運行在 CLR 2.0 上。所有新特性均為**編譯器語法糖**,IL 層面無變化。`clrver` 仍顯示 2.0.xxx。
public class User
{
public int Id { get; set; } // 讀寫
public string Name { get; private set; } // 唯讀 (外部不可設)
// public string Email { private get; set; } // 唯寫 (罕用)
}
var numbers = new int[10]; // int[]
var name = "Hello"; // string
var dict = new Dictionary<int,string>(); // Dictionary<int,string>
// var x; // 錯誤:必須初始化
// var y = null; // 錯誤:無法推斷類型
// 對象初始化器
var user = new User { Id = 1, Name = "Tom" }; // 呼叫無參構造 + 屬性 set
var user2 = new User(1) { Name = "Tom" }; // 呼叫帶參構造 + 屬性 set
// 集合初始化器
var list = new List<User> {
new User { Id = 1, Name = "A" },
new User { Id = 2, Name = "B" }
};
// IL: 編譯器生成臨時變量依次 Add
var p = new { Name = "Tom", Age = 25 };
// 類型名: <>f__AnonymousType0`2[System.String,System.Int32]
// 屬性唯讀,初始化後不可改
// p.Name = "Jerry"; // 編譯錯誤: read only
public static T Create<T>(Func<T> factory) => factory();
var anon = Create(() => new { Name = "Tom", Age = 25 }); // 型別推斷成功
匿名方法升級版,語法:`(參數) => {體}` 或 `(參數) => 表達式`
Func<string> f1 = () => "abc";
Func<int,int,int> add = (x, y) => x + y;
Action<string> log = msg => Console.WriteLine(msg);
Predicate<int> isEven = n => n % 2 == 0;
| 委托 | 簽名 | 用途 |
|---|---|---|
| Func<TResult> | () => TResult | 無參有返回 |
| Func<T, TResult> | (T) => TResult | 一參有返回 |
| Action<T> | (T) => void | 一參無返回 |
| Predicate<T> | (T) => bool | 條件判斷 |
編譯器生成私有靜態方法 `
public static class StringExtensions
{
public static string AddPrefix(this string s, string prefix)
=> prefix + s;
}
// 使用
"hello".AddPrefix(">>> "); // ">>> hello"
| 特性 | 關鍵字 | 核心優勢 | 注意點 |
|---|---|---|---|
| 自動屬性 | get/set | 減少樣板代碼 | 無邏輯、無初始值 |
| var | var | 簡化複雜泛型聲明 | 僅區域變量、必須初始化 |
| 初始化器 | { } | 聲明式構建對象圖 | 需無參構造 |
| 匿名類型 | new { } | 臨時數據傳遞 | 唯讀、不可跨方法強類型 |
| Lambda | => | 函數式編程基石 | 閉包捕獲變量生命週期 |
| 擴展方法 | this | 不修改源碼擴展行為 | 實例方法優先、無狀態 |
這六大特性奠定了現代 C# 風格,也是 LINQ、EF、ASP.NET Core 等框架的語言基石。