インデクサのおはなし - C#

インデクサの説明に何故にHashtableが出てくるのか不明。
いろいろ試したが、結論はインデクサは「インデクサ」。
「そういうこともできるよ」的な話であって、ただ作りこめば可能なことを持ち出してインデクサについての説明をややこしくしないでほしいね。

基本的な形はこんな感じ。

class Indexer
{
    int[] _i = new int[10];

    public int this[int index]
    {
        get
        {
            return _i[index];
        }
        set
        {
            _i[index] = value;
        }
    }
}


内部で保持する型を指定しいるのがこの部分
int[] _i = new int[10];
この部分は現実的ではないが、あくまで「こんな形」程度に。


インデクサのポイント
public int this[int index]
この部分でthisはint、インデックスはintと指定している。


プロパティのアクセサ同様、このthisブロックを自分自身のアクセサとしている。
たったこれだけのこと。
上の例は結局のところ、int配列を包んでいるクラスでしかない。


実際に使用すると、このようにint型以外のインデックスの使用、または値を格納することは出来ない。
Indexer i = new Indexer();
i[1] = 5;
//i[3] = "A"; //エラー
//i["four"] = 4; //エラー


ちなみにもし、下記のようなことが出来るなら、Hashtable の話を持ち出すのも理解できるが、これは例外が発生する。
つまりできません。
//エラー
class Indexer
{
    public int this[string index]
    {
        get
        {
            return this[index];
        }
        set
        {
            this[index] = value;
        }
    }
}
内部で実際に値を保持する変数が無いので当然これでは×。



じゃあ、内部にHashTableを持てばどうなの。

そのまんまの形では全く無意味なのでkeyにstringを指定してみる。
class IndexerHashtable
{
    Hashtable _h = new Hashtable();
    public object this[string key]
    {
        get
        {
            return _h[key];
        }
        set
        {
            _h[key] = value;
        }
    }
}
これで、keyにstring型しか受け付けないインデクサの出来上がり。


keyだけではなく、格納する値の型も指定するならこんなのはどう?
class IndexerGenericList<T>
{
    Hashtable _h = new Hashtable();
    public T this[string strkey]
    {
        get
        {
            return (T)_h[strkey];
        }
        set
        {
            _h[strkey] = value;
        }
    }
}


あれ? 気付いてしまいました。


例えば、keyもvalueもstringを指定するならこんなのでいける。
Dictionary<string, string> dic = new Dictionary<string, string>();

Dictionaryクラス使えばいいんじゃないか...

てなワケで、こんな簡単なつくりなら実際必要ありませんでしたと。

0 Comments:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts