2010-03-12 96 views
11

如果我通過集合屬性通過暴露內部成員:是否收集<T>包裝IList <T>或枚舉IList <T>?

public Collection<T> Entries 
{ 
    get { return new Collection<T>(this.fieldImplimentingIList<T>); } 
} 

當這個屬性被稱爲會發生什麼?例如會發生什麼時,下面的代碼行稱爲:

T test = instanceOfAbove.Entries[i]; 
instanceOfAbove[i] = valueOfTypeT; 

很清楚,每次這個屬性被稱爲一個新的參考類型創建的,但什麼acctually發生什麼呢?它是否簡單包裝下面的IList<T>,是否列舉了IList<T>並創建了一個新的Collection<T>實例?如果在for循環中使用此屬性,我擔心性能。

+0

'系列'包裝'IList '。你爲什麼把它作爲Collection 返回?爲什麼不把它公開爲IEnumerable ?你是否試圖阻止修改底層列表? –

+0

感謝您的提問!我沒有想到Collection只是一個包裝清單;) –

回答

4

根據反射器,新Collection<T>只是包裝的IList<T>

public Collection(IList<T> list) 
{ 
    if (list == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list); 
    } 
    this.items = list; 
} 

而且從the docs

初始化集合<的新實例(中<(T>)>) 作爲指定列表的包裝

(強調)

所以開銷是最小的(該列表不一一列舉),並且轉變爲返回集合會影響原來的列表中。

(順便說一句,我假設你指的是System.Collections.ObjectModel.Collection<T> - 沒有收藏的頂級System.Collections命名空間中的通用版本。)

+0

你說得對,關於命名空間。我的錯。我編輯了問題標題。 –

2

根據反射 - 這裏是構造的收藏:

public Collection(IList<T> list) 
{ 
    if (list == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list); 
    } 
    this.items = list; 
} 

因此,正如你可以看到收集包裝IList和沒有數據被複制。