6. 實現IDictionary接口中的Keys和Values屬性
現在我們可以著眼於IDictionary接口的實現。第4節中,專門針對這個接口做了一 個最簡化的例子,我們來回顧一下,它是怎麼實現IDictionary接口中的Keys和Values屬性的。
public ICollection Keys
{ //返回所有鍵的集合
get
{ //把所有鍵的集合拷貝到新數組中並返回
Object[] keys = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
keys[n] = items[n].Key;
return keys;
}
}
public ICollection Values
{ //返回 所有值的集合
get
{ //把所有值的集合拷貝到新數組中並返回
Object[] values = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
values[n] = items [n].Value;
return values;
}
}
可以很清楚地看到,它把數組裡的所有元素拷貝 到另一塊內存空間中並返回,這再一次帶來了性能問題,如果頻繁地訪問Keys和Values屬性還會給垃圾回收帶來壓力。最好的解決辦法當然是 直接引用而不是拷貝數組裡的元素,你還希望增加一些功能,可以使用索引訪問Keys屬性或Values屬性所返回的ICollection。但從第5節中的 圖2(最好直接下載下來以方便觀看)中可以看到ICollection接口只有寥寥幾個成員,並沒有Item屬性,怎麼辦呢?當然是從ICollection的子 接口中尋找合適的接口了。我們知道,ICollection接口是集合接口的基接口,而它的子接口則是更專用的集合接口,如IDictionary表示帶有鍵\值對的集合,IList表示值的集合,它們都可以按索引訪問。
所以這一次你決定另外實現公有的Keys和Values屬性,並返回一個 ILst<T>接口,並手動實現它,一方面滿足所有的功能,另一方面也可以實現IDictionary和IDictionary<TKey, TValue>接口的 Keys和Values屬性。好,先來看看ILst<T>接口的關系圖:
圖4 IList<T>接口關系圖