2010-03-12 68 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和没有数据被复制。