@ledsun blog

無味の味は佳境に入らざればすなわち知れず

インデクサの実装

C#で以下のようなインデックスを指定するアクセスメソッドを持ったクラスを、インデクサ*1で置き換えたいと思うことがあると思います。

public class MyDic
{
    private Dictionary<string, string> _data;

    public string GetAt(string index)
    {
        return _data[index]:
    }
}

クラス自体の修正は簡単です。

public class MyDic
{
    private Dictionary<string, string> _data;

    public string this[string index]
    {
        get
        {
            return _data[index]:
        }
    }
}

呼び出し側の修正が大変だと思います。リファクタリング機能が有れば良いのですがVisualStudio2005には残念ながら
該当するリファクタリング機能がありません。つまりmyDic.GetAt("KEY1");myDic["KEY1"];に置き換える作業です。

この場合、VisualStudioの置換機能が正規表現をサポートしているので、正規表現を使います。
[検索する文字列(N)]に\.GetAt\({[_a-zA-Z"+ ]+}\)を、[置換後の文字列(P)]に[\1]を指定します。

これでmyDic.GetAt("KEY1");myDic.GetAt("KEY" + 1);も置換できます。

次のように変数を参照していても大丈夫です。

string key1 = "KEY1";
myDic.GetAt(key1);

VisualStudioでは、タグ付き正規表現を指定するのに{}を使って参照には\を使うので注意してください*2

*1:http://ufcpp.net/study/csharp/oo_indexer.html

*2:http://konnokiyotaka.txt-nifty.com/pgblog/2005/11/visual_studio_7e2f.html