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

Effective C# 原則 49:為 C# 2.0 做好準備——泛型、迭代器、部分類型深度解析

     編輯:關於C#

C# 2.0(Visual Studio 2005)引入四大功能:泛型、迭代器、匿名方法、部分類型,極大提升開發效能。本文深入探討前三項。

泛型:參數化多型,類型安全與效能雙贏

泛型非 C# 獨有,CLR 與 MSIL 皆擴展支援,C#、VB.NET、Managed C++、J# 共享。泛型讓同一份代碼為不同類型生成專屬版本,解決 1.x 時代 ArrayList 存 object 的三大痛點:

  1. 非類型安全:可任意混放異類物件;
  2. 值類型頻繁裝箱/拆箱,效能損耗大;
  3. 取出時需強制轉型,易發生執行期錯誤。

語法範例

// 1.x 風格
public class List {
    internal class Node { internal object val; internal Node next; }
    public void AddHead(object t) { ... }
    public object Head() { return first.val; }
}

// 2.0 泛型
public class List<ItemType> {
    private class Node<ItemType> { internal ItemType val; internal Node<ItemType> next; }
    public void AddHead(ItemType t) { ... }
    public ItemType Head() { return first.val; }
}

// 使用
List<int> intList = new List<int>(); // 編譯器強制類型安全,零裝箱

運行時機制

  • C# 編譯器產生含型別佔位符(!0)的 MSIL;
  • JIT 編譯器實例化時替換為實際型別:值類型生成專屬版本(避免裝箱),參考類型共享單一 object 版本(避免代碼膨脹);
  • 型別資訊保留於實例中,編譯器可強制類型檢查。

約束

透過 where 限制型別參數必須實作特定介面或繼承特定基類,編譯器據此假設成員可用,省去強制轉型:

public class BinaryTree<ValType> where ValType : IComparable<ValType>, ISerializable { }

迭代器:yield 關鍵字簡化枚舉實作

1.x 需手寫 IEnumerable/IEnumerator、狀態管理,動輒數十行。2.0 yield return 讓編譯器自動生成狀態機:

public class List {
    public IEnumerable<object> Iterate() {
        for (int i = 0; i < theList.Length; i++)
            yield return theList[i];
    }
}

六行代替三十行,Bug 少、維護易、開發快。編譯器生成的 MSIL 與手寫版本等效。

部分類型:跨檔案分割類別定義

partial class 讓類別實作分散多檔案,主要服務 IDE/代碼產生器(如 Windows Forms 設計師、DataSet、Web 服務 Proxy),避免設計師代碼與手寫代碼混雜。限制:所有部分必須編譯進同一組件,無自動機制確保完整性,建議僅用於工具生成代碼。

// File1.cs
public partial class Form1 { private void InitializeComponent() { ... } }

// File2.cs
public partial class Form1 { public void MyMethod() { ... } }

遷移建議

新代碼優先採用泛型、介面約束、迭代器;既有代碼漸進式升級,降低遷移成本。

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