C# 5.0(隨 .NET Framework 4.5 發布)雖非大版本躍升,但引入了 async/await 異步編程模型 這一改變遊戲規則的特性,並補齊了語言層面的多項缺失。本文對比舊版本,詳細解析五大核心新功能。
:=: —— 簡化雙向數據綁定語法糖,減少 WPF/Silverlight/XAML 中雙向綁定的樣板代碼。
// 舊寫法:需實現 INotifyPropertyChanged 並手動同步
textBox1.Text = comboBox1.Text;
comboBox1.Text = textBox1.Text;
// C# 5.0 新語法
comboBox1.Text :=: textBox1.Text; // 雙向綁定一行搞定
評價:語法便利,但本質是編譯器生成雙向同步代碼,非運行時革命性突破。
new(T)擴展了泛型約束能力,允許指定構造函數簽名,大幅增強工廠模式、依賴注入框架的表達力。
// 僅限無參構造函數(舊版)
public class Factory where T : new() { }
// 支援帶參構造函數(C# 5.0)
public class Factory where T : new(int) { }
// 使用範例
var userFactory = new Factory(); // User 需有 public User(int id) 構造函數
意義:讓泛型編程在物件創建上更靈活,框架開發受益最大。
null 更直觀C# 2.0 引入 Nullable<T>(int?),但不支援直接運算。C# 5.0 修正此行為,null + 40 = 40 而非 null。
int? x = null;
int? y = x + 40; // C# 5.0 結果為 40,舊版為 null
// 連結 null 條件運算(配合 C# 6.0 ?. 更強)
MyObject obj = null;
var result = obj?.MyProperty ?? new MyOtherObject(); // 安全存取
場景:資料庫 NULL 值映射、財務計算中缺失數據處理。
case 標籤支援運算式 —— Switch 語句更靈活突破「只能用常數」限制,允許在 case 中使用方法調用、屬性存取等運算式。
switch (myObj) {
case string.IsNullOrEmpty(myOtherObj):
// 處理空字串邏輯
break;
case myOtherObj.Trim().ToLower():
// 處理特定字串值
break;
default:
break;
}
注意:運算式會依序評估,效能敏感場景需謹慎使用複雜運算式。
C# 3.0 有擴展方法,C# 5.0 引入擴展屬性語法(需配合特性標註),讓現有類型在不修改源碼情況下「新增」屬性。
[Extension]
public static int ExtensionProperty(this MyClass obj) {
get { return obj.GetState("ExtProp", 0); }
set { obj.SetState("ExtProp", value); }
}
// 使用
var instance = new MyClass();
instance.ExtensionProperty = 42;
async/await雖非語法糖層面的「五大特性」之一,但才是 C# 5.0 最大價值。將非同步代碼寫成同步風格,徹底解決回調地獄。
// 非同步方法簽名
Task GetMovieAsync(string title);
Task PlayMovieAsync(Movie movie);
// 異步流程控制
async void GetAndPlayMoviesAsync(string[] titles) {
foreach (var title in titles) {
var movie = await GetMovieAsync(title); // 非阻塞等待
await PlayMovieAsync(movie); // 續體自動排程
}
}
架構影響:推動了 Task-based Asynchronous Pattern (TAP) 成為標準,重塑了 I/O 密集型應用的設計範式。
| 特性 | 實用度 | 適用場景 |
|---|---|---|
| 綁定運算符 | ★★☆ | XAML 雙向綁定簡化 |
| 泛型構造函數約束 | ★★★★ | 框架開發、工廠模式、DI 容器 |
| 可空類型運算 | ★★★☆ | 資料庫映射、商業邏輯計算 |
| case 運算式 | ★★★☆ | 複雜條件分支、模式匹配前身 |
| 擴展屬性 | ★★★ | 第三方庫擴充、DTO 裝飾 |
| async/await | ★★★★★ | 所有 I/O 密集型、UI 響應性優化 |
C# 5.0 的核心價值在於 async/await,其餘特性多為語言完整性補充。升級專案時,優先重構非同步代碼以釋放效能與可維護性。