如果我通过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
循环中使用此属性,我会关注性能。
答案 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并且不会复制任何数据。