“返回新的Collection <t>(myList)”会在每次调用时创建新的集合对象吗?</t>

时间:2011-08-31 21:06:25

标签: c#

假设我有一个属性:

public Collection<T> GameCollection
{
  get { return new Collection<T>(_myGameList); }
}

这个方法每次调用时都会创建新的Collection对象吗?

4 个答案:

答案 0 :(得分:4)

是的,因为new会这样。但是它不会复制myGameList或其内容;它只为相同的myGameList创建新的包装器(参见Collection(IList<T>) constructor)。

如果你想阻止任何一个并返回一个集合,你可以初始化一个支持字段,让你的getter得到那个字段(假设_myGameList已经初始化):

private Collection<T> _myGameCollection = new Collection<T>(_myGameList);

public Collection<T> GameCollection
{
  get { return _myGameCollection; }
}

答案 1 :(得分:1)

它将创建Collection<T>的新实例,但每个新实例将包装相同的底层集合。 (根据文档,构造函数重载需要IList<T> wraps现有集合。)

因此,每次有人读取属性时都会返回一个新的Collection<T>实例(这会浪费并导致大量的垃圾回收),但它会返回一些逻辑上像每个集合一样的集合时间。

答案 2 :(得分:0)

是的,它会的。当您使用new关键字时,您始终会创建一个新实例。

答案 3 :(得分:0)

是的,它会创建一个新的集合,但这并不像听起来那么糟糕。

对于大多数类型,新集合仅包含每个项目的引用。换句话说,它只是集合中每个对象的额外4个字节的RAM,而不是复制所有对象的成本。当然,例外是值类型,但无论如何都需要小心使用它们。