C# のコードを読んでいると、ReadOnly のコレクションがあって、大体想像つくのだけど、使い方をためしてみた。
ReadOnlyCollection
リードオンリーのコレクション。System.Collections.ObjectModel の名前空間に存在するので using をするときには注意すること。本名前空間には、ReadOnlyCollection, ReadOnlyDictionary をはじめ、ReadOnlyObservableCollection とかあるので、rx 用かな。詳しくはこちら
ちなみに、ReadOnlyCollectionのリファレンスを見ると、IReadOnlyCollection, IReadOnlyList などのインターフェイスを実装している。
実際のソースコードはこちら。単純にAdd(...)
などのメソッドが呼ばれたら NotSupportedExceptionをスローしてるっぽい。
使い方
さて使い方ですが、例えば普通にリストを作って AsReadOnly()
メソッドを呼ぶか、ReadOnlyCollection のコンストラクタに渡すとよいです。
List<int> list = Enumerable.Range(0, 1000).ToList<int>();
IReadOnlyList<int> readOnlyList = list.AsReadOnly();
IReadOnlyList<int> col = new ReadOnlyCollection<int>(list);
ちなみに、実装上は上記のは同じです。
public ReadOnlyCollection<T> AsReadOnly()
=> new ReadOnlyCollection<T>(this);
注意点
予想通りですが、readonly
句などと同様に、こんなことをすると、書き換え可能です。
public class SomeClass
{
public string Value { get; set; }
}
:
var somes = new SomeClass[]
{
new SomeClass { Value = "hello"}
};
IReadOnlyList<SomeClass> readOnlySome = somes.ToList().AsReadOnly();
readOnlySome[0].Value = "world";
Console.WriteLine(readOnlySome[0].Value);
実行結果
world