Collection <t>是否包装IList <t>或枚举IList <t>?</t> </t> </t>

时间:2010-03-12 23:49:55

标签: c#

如果我通过Collection属性通过以下方式公开内部成员:

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

调用此属性时会发生什么?例如,调用以下代码行时会发生什么:

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

很明显,每次调用此属性时,都会创建一个新的引用类型,但实际上会发生什么?它是否只是将IList<T>包裹在下面,它是否枚举IList<T>并创建一个新的Collection<T>实例?如果在for循环中使用此属性,我会关注性能。

2 个答案:

答案 0 :(得分:4)

根据Reflector,新的Collection<T>只包装了IList<T>

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

来自the docs

  

初始化Collection&lt;(Of&lt;(T&gt;)&gt;)类的新实例   作为指定列表的包装

(强调补充)

因此开销很小(列表未枚举),对返回的集合的更改将影响原始列表。

(顺便说一句,我假设你指的是System.Collections.ObjectModel.Collection<T> - 在顶级System.Collections命名空间中没有Collection的通用版本。)

答案 1 :(得分:2)

根据Reflector - 这里是Collection的构造函数:

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

因此,您可以看到Collection包装IList并且不会复制任何数据。