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

Bri*_*ett 11 c#

如果我通过Collection属性公开内部成员:

public Collection<T> Entries
{
    get { return new Collection<T>(this.fieldImplimentingIList<T>); }
}
Run Code Online (Sandbox Code Playgroud)

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

T test = instanceOfAbove.Entries[i];
instanceOfAbove[i] = valueOfTypeT;
Run Code Online (Sandbox Code Playgroud)

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

ito*_*son 4

根据 Reflector 的说法,新版本Collection<T>只包含IList<T>

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

文档中:

将 Collection<(Of <(T>)>) 类的新实例初始化 为指定列表的包装器。

(强调已添加)

因此开销是最小的(不枚举列表),并且对返回集合的更改将影响原始列表。

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