都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

Immutable な Collection を試してみる

 メソッドが返すオブジェクトを予期しない形で変更されていたということは、私も経験したことがあります。Visual Basic で開発を担当していた時もそのような事象に遭遇したことがありました。C++ ではこのようなシーンに対応するため、const キーワードがあります。データ返却後、予期しない変更を避けるための機構です。C++ では下記のように実装します。

 

int GetHogeData ( const HogeHoge& hoge )

 

 返却するオブジェクトに const キワードを付加し、変更不可にすることが可能です。変更を加えるロジックを記述すると、コンパイルエラーが発生します。しかし、C# では 変数の const 宣言はありますが (これは当たり前ですが。)、 C++ と同様の返却値に対しての const 宣言は存在しません。

 C# で const の機能を実現するには、Immutable な Collection を使用したらいいのかなと思います。Immutable は .NETFramework 4.5 にも搭載されていません。別途 NuGet する必要があります。NuGet で、Immutable と入力する Immutable Collections がヒットします。【インストール】を行なってください。

f:id:koogucc11:20130609094337j:plain

Immutable で提供されている Collection は下記の通りです。詳しくはここを参照してください。

f:id:koogucc11:20130609102948p:plain

 早速、Immutable な Collection を試してみましょう。ソースコードは下記の通りです。

 

using System;

using System.Collections.Generic;

using System.Collections.Immutable;

 

namespace ImmutableCollectionTest

{

    class Program

    {

        static void Main(string[] args)

        {

            //Listクラスを使用して、KeyValuePairのデータを作成する。

            var lst = new List<KeyValuePair<string, string>>();

            lst.Add(new KeyValuePair<string, string>("key1", "data1"));

            lst.Add(new KeyValuePair<string, string>("key2", "data2"));

            lst.Add(new KeyValuePair<string, string>("key3", "data3"));

            lst.Add(new KeyValuePair<string, string>("key4", "data4"));

            lst.Add(new KeyValuePair<string, string>("key5", "data5"));

            //ImmutableなDictionaryの作成

            var im = ImmutableDictionary.Create<string, string>(lst);

            //初期化後にデータを追加してみる。

            im.Add("key6", "data6");

            Console.WriteLine("要素数は:" + im.Count.ToString());

            Console.Read();

        }

    }

}

 

出力結果は下記の通りです。要素数は 5 です。

f:id:koogucc11:20130609195632j:plain

key6 が追加されていません。初期化後の追加が不可能になっていますね。メソッドの戻り値に Immutable クラスを使用することで、C++ の const キーワードに近いことができます。あと、Immutable な Collection は、Mutable な Collection と比較して動作が高速なようです。返却後の Collectionオブジェクトに対して、変更が不必要であれば、Immutable を使用するべきなのでしょうか? 比較検証は簡単なので、今度やってみようかと思います。