首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

.NET 4.0 進階 (4):C# 4.0 新特性 — 命名/選用參數、dynamic、泛型協變逆變、同步原語

     編輯:關於C#

1. 命名參數與選用參數

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");      // 命名參數可跳過順序

2. dynamic — 動態繫結核心

靜態型別 `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(); // 編譯通過,執行期失敗

dynamic 與 object 差異

  • `object` 需強制轉型或反射才能呼叫成員。
  • `dynamic` 編譯器假定「支援所有操作」,執行期失敗拋 `RuntimeBinderException`。
  • 轉換:`dynamic → 強型別` 隱含轉換;`強型別 → dynamic` 隱含包裝。

3. 泛型協變與逆變

解決 `IList<string> → IList<object>` 不合法但語意安全的問題。

關鍵字方向限制記憶口訣
out (協變 Covariance)子 → 父T 僅用於輸出 (回傳值、屬性 get)Out = Output = 可往父類方向
in (逆變 Contravariance)父 → 子T 僅用於輸入 (參數、屬性 set)In = Input = 可往子類方向

協變範例:IEnumerable<out T>


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(); // 編譯通過

逆變範例:IComparer<in T>


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" });

.NET 4 內建協變/逆變介面

  • 協變:`IEnumerable<out T>`, `IEnumerator<out T>`, `IQueryable<out T>`
  • 逆變:`IComparer<in T>`, `IEqualityComparer<in T>`, `IComparable<in T>`
  • 委派:`Func<in T, out TResult>`, `Action<in T>`, `Predicate<in T>`

4. 新同步原語

CountdownEvent — 計數器同步


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();   // 阻塞直到歸零

Barrier — 階段式同步


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# 的靈魂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved