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

打造可逆向排序的泛型字典類 (七):實作非泛型 IDictionary 介面完整成員

     編輯:關於C語言

輔助驗證方法


private static bool IsCompatibleKey(object key)
{
    if (key == null) throw new ArgumentNullException(nameof(key));
    return key is TKey;
}
private static void VerifyKey(object key) { /* 同 IsCompatibleKey 但失敗拋 ArgumentException */ }
private static void VerifyValueType(object value) 
{ 
    if (!(value is TValue) && (value != null || typeof(TValue).IsValueType)) 
        throw new ArgumentException("參數類型錯誤", nameof(value)); 
    // 允許 nullable value type 為 null
}

ICollection.CopyTo 兩個版本

非泛型版本需處理 Array 可能為 KeyValuePair[] 或 object[]:


void ICollection.CopyTo(Array array, int arrayIndex)
{
    // 參數驗證:非 null、一維、下界 0、容量足夠
    var pairArray = array as KeyValuePair<TKey, TValue>[];
    if (pairArray != null) { /* 複製 KeyValuePair */ }
    else
    {
        var objArray = array as object[];
        if (objArray == null) throw new ArgumentException("錯誤的陣列類型");
        try { /* 裝箱複製 */ } catch (ArrayTypeMismatchException) { throw new ArgumentException("錯誤的陣列類型"); }
    }
}

IDictionary 顯式實作重點

  • Item 索引器:get 呼叫 IndexOfKey,set 驗證後轉呼泛型索引器(待實作)。
  • Keys/Values:回傳 GetKeyListHelper()/GetValueListHelper()。
  • Add、Contains、Remove:驗證類型後轉呼泛型對應方法。
  • GetEnumerator:回傳 Enumerator<TKey,TValue> 實例,使 foreach (DictionaryEntry de in dict) 可用。

Clear 共用實作


public void Clear() { version++; Array.Clear(keys, 0, _size); Array.Clear(values, 0, _size); _size = 0; }

測試 foreach (DictionaryEntry d in (IDictionary)rs) 輸出正確,但需轉型呼叫。下節實作泛型 IDictionary<TKey,TValue>。

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