LoginSignup
7
3

More than 5 years have passed since last update.

IReadOnlyList の使い方

Posted at

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

参考

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3