5
List<string> dinosaurs = new List<string>();
dinosaurs.Add("Tyrannosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Deinonychus");
dinosaurs.Add("Compsognathus");
  1. 为什么我应该使用ReadOnlyCollection如下:

    var readOnlyDinosaurs = new ReadOnlyCollection<string>(dinosaurs);
    

    代替:

    dinosaurs.AsReadOnly();
    
  2. 将 List 设置为 ReadOnlyCollection 或 AsReadOnly 的真正优势是什么?

4

4 回答 4

9

一般来说,它们是相同的,正如 Erwin 所提到的。但是,有一个重要的案例它们不同。因为该AsReadOnly方法是泛型的,所以新创建的类型ReadOnlyCollection是推断出来的,没有具体列出。通常这只会为您节省一些打字时间,但对于匿名类型来说,它实际上很重要。如果您有需要使用的匿名对象列表AsReadOnly,而不是new ReadOnlyCollection<ATypeThatHasNoName>.

于 2012-08-29T19:53:55.460 回答
7

没有区别,如果你看一下 AsReadOnly() 的代码:

public ReadOnlyCollection<T> AsReadOnly()
{
    return new ReadOnlyCollection<T>(this);
}
于 2012-08-29T19:46:58.280 回答
2

它们在功能上是等价的——但只是因为你从List<T>.

构造函数形式可以用 any 完成IList<T>,所以在某些情况下是唯一的选择。另一种形式更简洁一些,在某些人看来(我同意)更好地描述了你在做什么。

于 2012-08-29T19:49:01.787 回答
0

当您想保证没有人可以更改该集合时,您应该使用 readonly 集合。顺便说一句,这并不意味着调用者将无法更改该集合的内容

var collection = List<object> {new SomeObject{...},
               new SomeObject{..}}; //SOME OBJECT IS REFERENCE TYPE    
var readonly =  new ReadOnlyCollection<string>(collection );    
readonly[0].SomeObjectProperty = SomeValue; //HERE ORIGINAL OBJECT IS CHANGED

正如其他人所说,问题中存在的这两个电话之间没有区别。

于 2012-08-29T19:46:23.707 回答