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

C# 泛型字典 foreach 遍歷與型別參數約束雙重解析

     編輯:關於C語言

前言

本文涵蓋兩大核心主題:Dictionary<TKey, TValue> 等泛型字典的正確 foreach 遍歷姿勢(KeyValuePair vs DictionaryEntry),以及泛型型別參數約束(where T : IDisposable)的基礎概念與實戰模式。

一、泛型字典 foreach 遍歷

錯誤示範:沿用 DictionaryEntry

// 非泛型 Hashtable 時代寫法
foreach (DictionaryEntry de in myDict) // 編譯錯誤:無法轉換
{
    Console.WriteLine(de.Key); // 需轉型
}

正確寫法:KeyValuePair<TKey, TValue>

var dict = new Dictionary<int, string> { {1, "Foo"}, {2, "Bar"}, {3, "Baz"} };

foreach (var kvp in dict) // 隱含 KeyValuePair<int, string>
{
    Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}

為何必須用 KeyValuePair?

面向DictionaryEntry (非泛型)KeyValuePair<T,U> (泛型)
鍵/值型別object強型別 TKey/TValue
GetEnumerator 回傳IEnumerator (產出 DictionaryEntry)IEnumerator<KeyValuePair<T,U>>
效能需裝箱/拆箱零裝箱,結構體傳值
程式碼量需轉型直接存取強型別屬性

適用範圍

所有實作 IDictionary<TKey, TValue> 的類別:

  • Dictionary<TKey, TValue>
  • SortedList<TKey, TValue>
  • SortedDictionary<TKey, TValue>
  • ConcurrentDictionary<TKey, TValue>

二、型別參數約束基礎

問題場景

欲建立泛型集合,要求元素實作 IDisposable,以便移除時自動釋放資源。

解決方案:where 子句

public class DisposableList<T> : IList<T> where T : IDisposable
{
    private List<T> _items = new List<T>();

    private void Delete(T item) => item.Dispose(); // 安全呼叫介面方法

    public void RemoveAt(int index)
    {
        T item = _items[index];
        _items.RemoveAt(index);
        Delete(item);
    }
    // ...
}

約束效果

  • 編譯期:DisposableList<string> 報錯(string 未實作 IDisposable)
  • 編譯期:DisposableList<StreamReader> 通過
  • 程式碼內:可直接呼叫 item.Dispose(),無需轉型或反射

總結

  1. 泛型字典遍歷:永遠使用 foreach (var kvp in dict),享受強型別、零裝箱、程式碼簡潔三重優勢。
  2. 型別參數約束:where T : Interface 讓泛型在編譯期保證型別能力,安全呼叫介面成員,是泛型程式庫設計的基石。

兩者皆體現 C# 泛型系統「編譯期型別安全、執行期零成本」的核心設計哲學。

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