昨天我问了一个关于深度克隆列表的问题,我得到了一个很好的答案,你可以阅读here。
我遇到的问题是答案使用ImmutableList
并且我没有遇到任何问题,只是如果我想使用ReadOnlyCollection和确保我会返回一份副本我的集合,并且不能修改类中的那个。
我只是想知道以下内容是否正确。
private ReadOnlyCollection<Author> listofAuthors;
private List<Author> copyofAuthors;
public Book(ICollection<Author> authors)
{
copyofAuthors = new List<Author>(authors);
listofAuthors = new ReadOnlyCollection<Author>(new List<Author>(copyofAuthors));
}
public ICollection<Author> Authors
{
get
{
return new ReadOnlyCollection<Author>(new List<Author>(copyofAuthors));
}
}
根据MSDN documentation ReadOnlyCollection
只是一个基础可变集合的包装器。因此,如果对基础集合进行任何更改,它将反映在ReadOnlyCollection
中。上面的代码getter返回一个新的List作为只读集合。
问题1:
鉴于上述代码,调用它的任何其他代码都将获得私有ReadOnly(new List())的副本,对吗?用户所做的任何更改都不会反映在Book类的ReadOnlyCollection中,对吗?
问题2:
我理解ImmutableList
更理想,但如果我需要使用ReadOnlyCollection<Authors>
,那么我在构造函数/ Getter中所做的是正确的吗?或者它可以用另一种/更好的方式实施吗?