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. リストをReadOnlyCollectionまたはAsReadOnlyにすることの本当の利点は何ですか?

4

4 に答える 4

9

一般的に、 Erwinが述べたように、それらは同じです。ただし、それらが異なる重要なケースが1つあります。メソッドは汎用であるため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>

コンストラクター形式は任意IList<T>ので実行できるため、場合によってはこれが唯一のオプションです。もう1つの形式は少し簡潔で、一部の人にとっては(私は同意します)、自分が何をしているのかを説明するのに少し優れています。

于 2012-08-29T19:49:01.787 に答える
0

誰もそのコレクションを変更できないことを保証したい場合は、読み取り専用コレクションを使用する必要があります。ちなみに、これは発信者がそのコレクションのコンテンツを変更できないという意味ではありません。

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

他の人が言ったように、質問に存在するこれら2つの呼び出しの間に違いはありません。

于 2012-08-29T19:46:23.707 に答える