承接上篇對 .NET 1.0~3.5 的歷史回顧,本文聚焦 C# 4.0(隨 .NET 4.0 發布)的四大核心語言創新:動態程式設計、並行計算、協變與逆變、命名/可選參數,並展望未來趨勢。
C# 本質是靜態強類型語言,但互操作場景(反射、COM、動態語言)常需運行時繫結。C# 4.0 引入 dynamic 關鍵字,將類型決策推遲到執行期:
dynamic d = GetDynamicObject();
d.MyMethod(22); // 方法呼叫
d.A = d.B; // 屬性存取
d["one"] = d["two"]; // 索引器
int i = d + 100; // 運算子
string s = d(1, 2); // 委派呼叫
編譯器不檢查上述操作,而是生成動態呼叫站點,由 DLR (Dynamic Language Runtime) 在運行時解析真實類型並分派。DLR 也為 IronPython、IronRuby 等動態語言提供統一互操作基礎設施。
ref missing 等繁瑣代碼)// 裝載 IronPython 範例
ScriptRuntime py = Python.CreateRuntime();
dynamic mypy = py.UseFile("myfile.py");
Console.WriteLine(mypy.MyMethod("Hello"));
多核時代來臨,傳統執行緒模型複雜且難擴展。.NET 4.0 內建 TPL (Task Parallel Library) 與 PLINQ (Parallel LINQ),提供統一排程器,大幅降低並發複雜度:
// 平行迴圈
Parallel.For(0, 10, i => { DoSomething(i); });
// PLINQ 查詢
int[] data = { 0,1,2,3,4,5,6,7,8,9 };
int[] selected = (from x in data.AsParallel() select x + 1).ToArray();
實測雙核環境下,平行版本耗時 2001ms vs 串行 4500ms。註:.NET 3.5 可透過安裝 Parallel Extensions CTP 提前體驗。
陣列支援協變(Derived[] → Base[]),但泛型預設為不變(List<Derived> ≠ List<Base>)。C# 4.0 引入 out(協變,僅作返回值)與 in(逆變,僅作參數)修飾符:
// 協變:IEnumerable<out T> 允許 IEnumerable<Derived> → IEnumerable<Base>
public interface ICovariant<out T> { T Get(); }
// 逆變:IComparer<in T> 允許 IComparer<Base> → IComparer<Derived>
public interface IContravariant<in T> { void Compare(T x, T y); }
// 同時支援
public interface IBoth<out U, in V> { }
這使得泛型介面在保持類型安全前提下,支援更自然的多型轉換。
簡化方法多載,提升呼叫可讀性:
// 可選參數(預設值)
public void MyMethod(int x, int y = 10, int z = 100) { }
// 呼叫方式
MyMethod(1); // y=10, z=100
MyMethod(1, 2); // z=100
MyMethod(20, z: 200); // 命名參數跳過 y,等同 MyMethod(20, 10, 200)
Anders Hejlsberg 願景:將編譯器轉為服務,讓開發者在編譯期/運行期自由控制邏輯(如原始碼分析、重構、動態生成)。結合函數式、並行、動態特性,C# 將持續演進為「語言美學的集大成者」——從 foreach、using、attribute 到 LINQ,每項創新都在為開發體驗減負。