【.NET Framework 4.5】IReadOnlyListとIReadOnlyDictionary

  • 2013.02.07 Thursday
  • 21:28

.NET Framework 4.5からIReadOnlyList<out T>とIReadOnlyDictionary<TKey, TValue>が追加されたようですね。

IReadOnlyList<out T>がインデックスをサポートする読み取り専用のコレクション。
IReadOnlyDictionary<TKey, TValue>がキーと値のペアの読み取り専用ディクショナリ−。

    class A
    {
        private readonly List<string> _list = new List<string>();

        public void HogeAction()
        {
            // 内部では_listを可変長で要素の入れ替えが可能なListとして扱うロジックが書ける。
        }

        // 利用する側はインデックスがサポートされた読み取り専用のコレクションとして扱う事ができる。
        // Aクラスの内部状態に不用意に干渉することを避けられる。
        public IReadOnlyList<string> Source { get { return _list; } } 
    }

IList<T>は、読み取り専用も可変長もプロパティで利用側が判断する必要があり、なかなか使いにくく、隠蔽化されたオブジェクトからメソッドやプロパティでIList<T>が返された場合は、なるべく触らぬ神にたたり無しと入った感じで、暗黙的にIReadOnlyList的な使い方をしていました。もしくは、新しくコレクションを作成していました。そういった気苦労をしなくて良くなったという訳です。

またクラス提供者としては、メソッドやプロパティでIReadOnlyListを公開し、その内部ではList<T>として扱う事ができ、可変長で値の変更も自由にできる、外部ではそのインスタンスを読み取り専用としてそのまま公開できるというメリットが生まれます。インデックスをサポートしてないだけで.NET Famework 3.5(だったかな?)でIReadOnlyCollection<T>が追加されていたので、インデックスが使えるようになったというところが良くなった点ですが・・・・。

IReadOnlyCollection<T>と同様に、IReadOnlyList<T>のTのインスタンスの状態はTクラスの設計次第で可変になるのでこの当たりは注意が必要かと・・・・心配ならTクラスに対しても読み取り専用TReadOnlyを用意し、ジェネリクスの共変性を利用すれば完全に書き換え不可能なものを返す事もできそうですが・・・めんどくさいですね。

ジェネリクスの共変性を利用して、要素の状態も書き換え不可能なコードを作成してみましたが、これはとにかくめんどくさいですね。

        static void Main(string[] args)
        {
            var list1 = new List<T> {new T() {Value = 1}, new T() {Value = 2}};
            list1[1].Value = 10; // 書き換え可能

            IReadOnlyList<T> list2 = new List<T> { new T() { Value = 1 }, new T() { Value = 2 } };
            list2[1].Value = 10; // 書き換え可能

            IReadOnlyList<IReadOnlyT> list3 = new List<T> { new T() { Value = 1 }, new T() { Value = 2 } };
            // list3[1].Value = 10; // 書き換え不可能コンパイルエラー
        }

        interface IReadOnlyT
        {
            int Value { get; }
        }

        class T : IReadOnlyT
        {
            public int Value { get; set; }
        }


----------------------------------------
今日、さんざんこのインターフェイスを使って、コードを書いてみたのですが、すごくしっくりくるコードが書けました。

----------------------------------------
IReadOnlyDictionaryは、Linq to Objectsを使っているとToDicitonaryメソッドではキーがぶつかった時に例外が発生してしまうため、あまり使う機会がなくなりました。代わりにILookupをよく使うようになりました。HashSetの読み取り専用もあっても良いかもしれません。私が利用する場合はHashSetはほとんどコンストラクタ時に決定したコレクションから変動することがないので・・・。といってもローカル変数レベルの話なので、いらないのか・・・・保守の観点から同じクラスを複数人がいじるときのコミュニケーションとして必要?

コメント
管理者の承認待ちコメントです。
  • -
  • 2018/06/06 5:21 PM
コメントする








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

calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< January 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM