2

これがメインクラスです

 class Program
{
    static void Main(string[] args)
    {
        MyArray fruit = new MyArray(-2, 1);
        fruit[-2] = "Apple";
        fruit[-1] = "Orange";
        fruit[0] = "Banana";
        fruit[1] = "Blackcurrant";
        Console.WriteLine(fruit[-1]);       // Outputs "Orange"
        Console.WriteLine(fruit[0]);        // Outputs "Banana"
        Console.WriteLine(fruit[-1,0]);     // Output "O"
        Console.ReadLine();
    }
}

インデクサーのクラスは次のとおりです。

class MyArray
{
    int _lowerBound;
    int _upperBound;
    string[] _items;

    public MyArray(int lowerBound, int upperBound)
    {
        _lowerBound = lowerBound;
        _upperBound = upperBound;
        _items = new string[1 + upperBound - lowerBound];
    }

    public string this[int index]
    {
        get { return _items[index - _lowerBound]; }
        set { _items[index - _lowerBound] = value; }

    }

    public string this[int word, int position]
    {
        get { return _items[word - _lowerBound].Substring(position, 1); }
    }
}

したがって、「クラスMyArray」で定義されている多次元インデクサ

「word」の値として「-1」をインデクサーに渡すと、これがどのように機能するのか理解できません。'_lowerbound'の値は'-2'です。つまり、returnの値は_items [-1-(-2)]である必要があり、これにより_items[1]になります。

しかし実際には、果物の-1インデックス、つまりオレンジを指しています。

私の疑問を解消してください。

4

4 に答える 4

4

これはあなたのプライベートアレイ_itemsです:

   0 1 2 3
┌────┐┌────┐┌────┐┌────┐
│Ap││または││Ba││Bl│          
└────┘└────┘└────┘└────┘  

インデクサーを使用すると、次のように表示されます。

  -2 -1 0 1
┌────┐┌────┐┌────┐┌────┐
│Ap││または││Ba││Bl│          
└────┘└────┘└────┘└────┘  

の値は_lowerboundです-2

つまり、returnの値は、である必要があります。_items[-1 - (-2)]これにより、になり_items[1]ます。

そのとおりです。

-1しかし実際には、それは果物のインデックス、すなわちオレンジを指しています。

それは間違っている。_items[1]それは、すなわちオレンジを指しています。

インデクサーは、クラスを配列のように使用できるようにする簡単な方法です。内部的には、提示された値を任意の方法で管理できます。

_itemsMyArray作成されたオブジェクトと同じ長さのゼロベースの配列です。

インデクサーは、提供されたインデックス番号を解釈し、それをこの基になる配列に対してマップしているだけです。

于 2012-07-09T09:28:39.467 に答える
2

これは、期待される意味での多次元配列ではなく、1つのように見えます。

更新された回答:

あなたが期待しているように見えます:fruits[-1, 0]と同じ要素を指すことfruits[1] = "Blackcurrent"。残念ながら、これは当てはまりません。どちらの場合も、実際にカスタムインデクサーを使用しており、どちらも提供されたインデックス値を変更します。

のカスタムインデクサーMyArray、基になるに到達するに、提供しているインデックス値を変更しています。ここで混乱が生じました。カスタムインデクサーのコードを考慮していません。string[]

public string this[int index]
{
    get { return _items[index - _lowerBound]; }
    set { _items[index - _lowerBound] = value; }

}

public string this[int word, int position]
{
    get { return _items[word - _lowerBound].Substring(position, 1); }
}


古い答え:

プリミティブ配列の配列インデックスとカスタム実装のインデックスを混同しないでください。後者では好きなことを行うことができます。基本的には、メソッド呼び出しに対する単なる構文糖衣です。をとるインデクサーがあります。これは、有効なものがインデクサーの有効な引数でintあることを意味しますint(ただし、基になるプリミティブ配列の場合はそうではない可能性がありますstring[])。

インデックスの実装lowerBoundはgetとsetの両方から減算するため、setで指定された同じインデックスは、getに指定されたインデックスと同じ要素になります。

2つのパラメーターを受け取る2番目のインデクサーは同じインデックス変更を行っているため、同じ要素(オレンジ)になります。

混乱はどこにありますか?の2番目のパラメータを期待していますか...

public string this[int word, int position]

...どの要素が返されるかに何らかの影響を与えるために?Substringこれは、序数によって返される要素の呼び出しで使用され、選択される要素には影響word - lowerBoundしません。

于 2012-07-09T08:42:14.373 に答える
1

this[int]およびthis[int、int]で計算されたインデックスは、_items配列で必要なインデックスであり、この配列はインデックス0から始まります。したがって、2番目のアイテムは実際にindex = 1であり、オレンジです。

更新:_items [-1]は存在しません。この配列は、インデックス0から始まります。

于 2012-07-09T08:43:21.983 に答える
1

C#などの.Net言語の配列には、負のインデックスを持つアイテムを含めることはできません。

これを回避するために、この配列クラスは、インデックスが最も低いアイテム(のインデックス_lowerBound)を0に移動します。したがって、内部配列にアクセスするときは、インデックスから減算する必要が_lowerBoundあるため、負のインデックスを渡そうとはしません。

これが、-1-(-2)が1に等しいため、内部配列で-1が実際に1になる理由です。

編集:クラスの2つのインデクサーの間に違いがあるはずだと思う理由がわかりません。_items[index - _lowerBound]どちらも、基になる.Net配列にアクセスするために使用します。String.Substring呼び出しを除いて、2つのインデクサーの間に違いはありません。

最初のインデクサーを呼び出すように2番目のインデクサーのコードを変更してみてください。同じ文字が返されることがわかります。(http://ideone.com/sFmDo

于 2012-07-09T08:51:50.217 に答える