C# 4.0 隨著 Visual Studio 2010 正式發布,帶來了許多令人期待的語言增強功能。這些特性不僅提升了開發效率,更從根本上改變了我們編寫代碼的方式。本文將詳細闡述 C# 4.0 的四大核心特性:委托實現介面、匿名返回類型、鴨子類型/結構子類型支援,以及安全的空值延遲賦值操作符。
C# 4.0 引入了「委托模式」,允許類別透過委托將介面實現映射到內部成員變數,大幅減少樣板代碼。以 IList 為例,傳統寫法需要在外部類別中逐一實現介面方法並轉呼叫內部集合,如今只需一行聲明即可:
public class Foo : IList
{
private List _Collection implements IList;
public Foo()
{
_Collection = new List();
}
}
被委托的成員可實現一或多個介面(以逗號分隔)。這不僅消除了大量轉發方法,也強化了對 Mixins 的支援。根據維基百科定義,委托模式是指物件對外表現某行為,實際上將實作任務委派給相關成員,屬於加強組合、Mixins 及 Aspects 的基礎模式。
進階用法允許選擇性重寫特定方法:
public class Foo : IList
{
private List _Collection { get; set; } implements IList;
public Foo() { _Collection = new List(); }
// 覆寫委托的執行
public int IList.Add(string value)
{
if (!_Collection.Contains(value))
_Collection.Add(value);
}
}
C# 4.0 讓匿名類型擁有與一般類別宣告同等地位。以往匿名類型僅限區域變數,無法作為方法回傳值。若強類型 LINQ 查詢結果能直接作為回傳類型,將極大簡化代碼:
public var GetProductInfos()
{
var productInfos =
from p in products
select new { p.ProductName, p.Category, Price = p.UnitPrice };
return productInfos;
}
此特性讓資料傳遞更靈活,特別適合資料傳輸物件(DTO)的輕量化建構。
若某類別擁有與介面相符的方法/屬性簽章,即使未顯式實作該介面,也視為隱式實作。這就是所謂的「靜態鴨子類型」——「走起來像鴨子、叫起來像鴨子,那就是鴨子」。
實際應用場景:.NET 框架中 TextBox、DataGrid、NumericUpDown 等控制項皆有 ReadOnly 屬性,但未實作共同介面。定義介面 IReadOnlyRestricable 後,透鴨子類型可直接轉型:
public interface IReadOnlyRestricable
{
bool ReadOnly { get; set; }
}
foreach (Control c in f.Controls)
{
IReadOnlyRestricable editable = c as IReadOnlyRestricable;
if (editable != null)
editable.ReadOnly = true;
}
這避免了反射查找屬性的效能損耗,並降低程式庫間的耦合度。Krzysztof Cwalina 指出 C# 的 foreach 關鍵字本質上已採用鴨子類型機制。
引入 ?. 操作符,安全存取可能為 null 的物件鏈。例如 Customer?.FirstName 若 Customer 為 null 則回傳 null 而非拋出 NullReferenceException。結合可為 null 的值類型(int?),可優雅處理多層巢狀物件:
// 傳統寫法需層層檢查
if ((Customer != null) && (Customer.Order != null))
int a = Customer.Order.OrderNumber;
// C# 4.0 簡潔寫法
int? orderNumber = Customer?.Order?.OrderNumber;
if (orderNumber.HasValue)
{
// 使用 orderNumber.Value
}
此特性大幅減少防禦性程式碼,提升可讀性與維護性。
C# 4.0 這四大特性分別針對程式碼重複、類型剛性、介面耦合與空值處理四大痛點,讓開發者能以更聲明式、更安全的方式編寫高品質代碼。善用這些特性,將顯著提升專案的開發效率與程式碼品質。