假设我有一个属性:
public Collection<T> GameCollection
{
get { return new Collection<T>(_myGameList); }
}
这个方法每次调用时都会创建新的Collection对象吗?
答案 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,而不是复制所有对象的成本。当然,例外是值类型,但无论如何都需要小心使用它们。