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 がヒットします。【インストール】を行なってください。
Immutable で提供されている Collection は下記の通りです。詳しくはここを参照してください。
早速、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 です。
key6 が追加されていません。初期化後の追加が不可能になっていますね。メソッドの戻り値に Immutable クラスを使用することで、C++ の const キーワードに近いことができます。あと、Immutable な Collection は、Mutable な Collection と比較して動作が高速なようです。返却後の Collectionオブジェクトに対して、変更が不必要であれば、Immutable を使用するべきなのでしょうか? 比較検証は簡単なので、今度やってみようかと思います。