VB 風格特性終登 C#,大幅簡化多參數方法呼叫。
// 定義:選用參數必須在最後,提供預設值
void Write(string p1, string p2 = "default", bool p3 = true) {
Console.WriteLine($"p1:{p1}; p2:{p2}; p3:{p3}");
}
// 呼叫示範
Write("hello"); // p2=default, p3=true
Write("hello", "world"); // p2=world, p3=true
Write("hello", p3: false, p2: "named"); // 命名參數可跳過順序
靜態型別 `dynamic`,編譯期跳過型別檢查,執行期由 DLR (Dynamic Language Runtime) 解析成員呼叫。適用:COM Interop、IronPython/Ruby、HTML DOM、反射包裝。
dynamic d = new DynamicDemo();
d.Hello("method"); // 呼叫方法
d.Name = "prop"; // 設定屬性
var idx = d["indexer"]; // 索引子
var count = d.GetNames().Count; // 回傳 List<string> 隱含轉換
// 注意:dynamic 不支援擴充方法
// d.GetNames().Last(); // 編譯通過,執行期失敗
解決 `IList<string> → IList<object>` 不合法但語意安全的問題。
| 關鍵字 | 方向 | 限制 | 記憶口訣 |
|---|---|---|---|
out (協變 Covariance) | 子 → 父 | T 僅用於輸出 (回傳值、屬性 get) | Out = Output = 可往父類方向 |
in (逆變 Contravariance) | 父 → 子 | T 僅用於輸入 (參數、屬性 set) | In = Input = 可往子類方向 |
class Human { public string Name; }
class Hero : Human { public string Story; }
var humans = new List<Human> { new Human { Name = "A" } };
var heroes = new List<Hero> { new Hero { Name = "H", Story = "S" } };
// Hero 可協變為 Human
List<Human> all = humans.Union(heroes).ToList(); // 編譯通過
interface IOutput<in T> { void Write(T obj); }
class Output<T> : IOutput<T> where T : Human {
public void Write(T obj) => Console.WriteLine(obj.Name);
}
IOutput<Human> humanOut = new Output<Human>();
IOutput<Hero> heroOut = humanOut; // 合法:Human 輸入介面可接受 Hero
heroOut.Write(new Hero { Name = "Web" });
using var cde = new CountdownEvent(1); // 初始計數 1 (主執行緒)
var t1 = Task.Run(() => { Work("A", 1000); cde.Signal(); });
cde.AddCount(); t1.Start();
var t2 = Task.Run(() => { Work("B", 2000); cde.Signal(); });
cde.AddCount();
var t3 = Task.Run(() => { Work("C", 3000); cde.Signal(); });
cde.AddCount();
cde.Signal(); // 主執行緒完成,計數歸零
cde.Wait(); // 阻塞直到歸零
var barrier = new Barrier(2); // 2 參與者
Task.Run(() => { Phase1("A", 1000); barrier.SignalAndWait(); Phase2("A"); });
Task.Run(() => { Phase1("B", 2000); barrier.SignalAndWait(); Phase2("B"); });
// 兩者皆完成 Phase1 才同時進入 Phase2
C# 4.0 以 `dynamic` 擁抱動態世界,以協變逆變修補泛型剛性,以命名/選用參數簡化 COM 呼叫,以 Task/Parallel/PLINQ 開啟多核時代——這版本奠定了現代 C# 的靈魂。