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

C# 未來語言特性前瞻:泛型、迭代器、匿名方法與部分類型

     編輯:關於C語言

背景

本文根據 Microsoft 2003 年發布的技術白皮書,介紹 C# 下一個主要版本(後來的 C# 2.0)規劃的四大核心功能:泛型、迭代器、匿名方法、部分類型。雖然文件年代久遠,但這些概念已成為現代 C# 基石,回顧設計初衷有助於深入理解。

泛型

現有做法的缺點

早期使用 object 型別配合裝箱/拆箱實作類泛型集合(如 Stack),存在三大問題:

  1. 效能損耗:值類型頻繁裝箱/拆箱。
  2. 型別安全缺失:編譯期無法阻止錯誤型別放入集合,執行期才拋出 InvalidCastException。
  3. 程式碼膨脹:為每種型別寫專屬集合(IntStack, StringStack...)。

泛型解法

public class Stack<ItemType>
{
    private ItemType[] items;
    public void Push(ItemType data) { ... }
    public ItemType Pop() { ... }
}

// 使用時指定實際型別
Stack<int> intStack = new Stack<int>();
intStack.Push(3);
int x = intStack.Pop(); // 無需轉型,無裝箱

Stack<Customer> custStack = new Stack<Customer>();
custStack.Push(new Customer());
Customer c = custStack.Pop(); // 型別安全

泛型優勢

  • 編譯期型別檢查,杜絕執行期轉型錯誤。
  • 值類型零裝箱,效能接近手寫專屬類別。
  • 單一原始碼支援任意型別,減少重複代碼。
  • 支援多型別參數:Dictionary<KeyType, ValType>。

約束

當泛型內部需呼叫型別參數的特定成員(如 CompareTo),需加約束:

public class Dictionary<KeyType, ValType> where KeyType : IComparable
{
    public void Add(KeyType key, ValType val)
    {
        // 現在可直接呼叫 key.CompareTo(...)
    }
}

約束確保實例化時提供的型別滿足介面/基類要求,將錯誤提前到編譯期。

迭代器

使用 yield return 簡化 IEnumerable 實作:

public IEnumerable<int> GetNumbers()
{
    yield return 1;
    yield return 2;
    yield return 3;
}

編譯器自動產生狀態機,支援 foreach 與 LINQ 查詢。

匿名方法

內嵌程式碼區塊作為委派實例,捕獲外部變數(閉包):

button.Click += delegate(object sender, EventArgs e)
{
    MessageBox.Show("Clicked at " + DateTime.Now);
};

後來演進為 Lambda 運算式 () => { ... }。

部分類型

將單一類別定義拆分到多個檔案,利於設計工具產生代碼與手寫邏輯分離:

// File1.cs
public partial class MyForm { ... }

// File2.cs (設計工具產生)
public partial class MyForm { ... }

總結

這四大特性圍繞「統一型別系統」、「元件導向開發」、「開發者控制力」與「實用語言結構」四大設計目標,奠定了 C# 2.0 乃至現代 C# 的核心能力。

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