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

C# 4.0 新特性全景圖:從 Anders Hejlsberg PDC 2008 談起

     編輯:關於C#

細聽 Anders Hejlsberg (C# 之父) 在 PDC 2008 的《The Future of C#》演講,梳理 C# 4.0 完整特性地圖。

版本號統一里程碑

VS 2008 對應 .NET 3.5 / C# 3.0 / CLR 2.0 — 版本號混亂。VS 2010 統一為 4.0 (CLR 4.0、.NET 4、C# 4、VB 10),CLR 3 成為歷史術語。

C# 版本演進時間軸
C# 1.0~4.0 演進路線

四大核心支柱

1. 動態型別物件


// 反射寫法 (C# 3.0)
object calc = GetCalculator();
int sum = (int)calc.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, new object[]{10,20});

// dynamic 寫法 (C# 4.0)
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20); // 執行期繫結,支援 COM、IronPython、DOM、反射

IronPython 呼叫範例


var py = Python.CreateRuntime();
dynamic hello = py.UseFile("helloworld.py");
Console.WriteLine("helloworld.py loaded!");

實現基礎:IDynamicObject / DynamicObject


public abstract class DynamicObject : IDynamicObject {
    public virtual object GetMember(GetMemberBinder info) { ... }
    public virtual object SetMember(SetMemberBinder info, object value) { ... }
    public virtual object Invoke(InvokeBinder info, object[] args) { ... }
    public virtual object InvokeMember(InvokeMemberBinder info, object[] args) { ... }
    public virtual object CreateInstance(CreateInstanceBinder info, object[] args) { ... }
    public virtual object GetIndex(GetIndexBinder info, object[] indices) { ... }
    public virtual object SetIndex(SetIndexBinder info, object[] indices, object value) { ... }
    public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices) { ... }
    public virtual object UnaryOperation(UnaryOperationBinder info) { ... }
    public virtual object BinaryOperation(BinaryOperationBinder info, object arg) { ... }
    public virtual object Convert(ConvertBinder info) { ... }
    public MetaObject GetMetaObject() { ... }
}

2. 命名參數與選用參數

編譯器層面特性,VB 早有,社群呼聲高納入。


// 定義
public StreamReader OpenTextFile(string path,
    Encoding encoding = null,
    bool detectEncoding = true,
    int bufferSize = 1024);

// 呼叫:命名參數可跳過順序、僅指定關心者
OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096);
OpenTextFile(bufferSize: 4096, path: "foo.txt", detectEncoding: false);

3. 改進的 COM 互操作性

改進點說明
Automatic object → dynamic mappingCOM `object` 參數/回傳自動視為 `dynamic`,免強轉
Optional & named parameters消除大量 `ref missing`
Indexed properties支援 `obj[0]` 語法對應 COM 索引屬性
Optional "ref" modifier呼叫 COM `ref` 參數可省略 `ref` 關鍵字
Interop type embedding (No PIA)編譯器僅嵌入實際使用的 COM 型別元資料,免部署巨大 PIA

4. 協變與逆變

解決 `IList<string> → IList<object>` 型別安全難題。


// 協變:out T (僅輸出位置) — 子轉父安全
public interface IEnumerable<out T> { IEnumerator<T> GetEnumerator(); }

// 逆變:in T (僅輸入位置) — 父轉子安全
public interface IComparer<in T> { int Compare(T left, T right); }

.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>`, `Comparison<in T>`, `EventHandler<in T>`

Compiler as a Service (預覽)

編譯器開放 API,支援執行期動態編譯執行字串程式碼,類似 JavaScript `eval`。Anders Demo:<30 行打造 C# REPL,支援定義函數、動態建立 WinForm + Button,展示極致動態能力。

資源連結


C# 4.0 以 `dynamic` 拥抱動態世界,以協變逆變修補泛型剛性,以命名/選用參數與 No-PIA 徹底簡化 COM 互操作,以 Compiler-as-Service 開啟元程式設計大門——這版本確立了現代 C#「靜態核心、動態邊界」的雙重身分。

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