2008年04月02日

ReadOnlyCollection<T>

  
public IList<String> GetNames() { ... }

というメソッドがあった場合に、この戻り値であるリストオブジェクトを、変更させたくない場合がある。

残念ながら

public readonly IList<String> GetNames() { ... }

とは書けない。

でも、.NETFramework2.0には、ReadOnlyCollectionというコレクションクラスがあるので、これを使えば、「読み取り専用にする」という要求を(完璧ではないが)満たせる。

public ReadOnlyCollection<String> GetNames() {
var list = new List<String>();
list.Add(...);
...
return new ReadOnlyCollection<String>(list);
}

なお、ReadOnlyCollectionクラスは、IList, ICollection, IEnumerable
を実装しているので、コレクションクラスとして大抵のことはできるが、呼び出し側では、

var x = GetNames();
x.Add("Microsoft"); // コンパイルエラー
x.Remove("Windows"); // コンパイルエラー

といったコレクションを変更するコードを書くことができない。

もちろん、ReadOnlyCollectionは、Listをラップしているだけなので、大元の LIstを操作すれば、コレクションを変更できる。

ちなみに、.NET Framework1.1には、ReadOnlyCollectionBaseという非ジェネリッククラスもあったが、もう使う必要はないだろう。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51464728