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); }
    }
}

因此,在“Class MyArray”中定义的多维索引器

当我们将“-1”作为“word”的值传递给索引器时,我无法理解这是如何工作的。“_lowerbound”的值为“-2”。所以这意味着,返回的值应该是_items[-1 - (-2)],这使它成为_items[1]。

但实际上它指向水果的-1 指数,即橙色。

请清除我的疑问。

4

4 回答 4

4

This is you private array _items:

   0     1     2     3
┌────┐┌────┐┌────┐┌────┐
│ Ap ││ Or ││ Ba ││ Bl │          
└────┘└────┘└────┘└────┘  

This is how it appears using the indexer:

  -2    -1     0     1
┌────┐┌────┐┌────┐┌────┐
│ Ap ││ Or ││ Ba ││ Bl │          
└────┘└────┘└────┘└────┘  

The value for _lowerbound is -2.

So it means, the value for the return should be _items[-1 - (-2)], which makes it _items[1].

That's correct.

But actually it is pointing to -1 index of fruits i.e. Orange.

That's wrong. It is pointing to _items[1], i.e. Orange.

Indexers are a simple way to permit a class to be used like an array. Internally, you can manage the values presented in any fashion you wish.

_items is a zero-based array with the same length as the created MyArray object.

The indexer is just interpreting the index number supplied and map it against this underlying array.

于 2012-07-09T09:28:39.467 回答
2

这不是预期意义上的多维数组,它只是看起来像一个。

更新答案:

看起来您期望: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[])。

您的索引实现从 get 和 set 中减去lowerBound,因此在 set 中提供的相同索引将导致与为 get 提供的索引相同的元素。

采用两个参数的第二个索引器正在执行相同的索引修改,因此将产生相同的元素(橙色)......

混乱在哪里?您是否期望...的第二个参数

public string this[int word, int position]

...以某种方式影响返回的元素?它用于Substring调用 ordinal 返回的元素word - lowerBound,它不影响选择什么元素。

于 2012-07-09T08:42:14.373 回答
1

.Net 语言(如 C#)中的数组不能包含具有负索引的项。

为了避免这种情况,这个数组类将具有最低索引(的索引_lowerBound)的项移动到 0。因此,当您访问内部数组时,您必须_lowerBound从索引中减去,因此它永远不会尝试传递负索引。

这就是为什么 -1 在内部数组中实际上是 1,因为 -1 - (-2) 等于 1。

编辑:我不确定你为什么认为你的班级的两个索引器之间应该有区别。它们都用于_items[index - _lowerBound]访问底层的 .Net 数组。除了 String.Substring 调用之外,这两个索引器之间没有区别。

尝试更改第二个索引器的代码,使其调用第一个索引器,您会看到它返回相同的字符。( http://ideone.com/sFmDo )

于 2012-07-09T08:51:50.217 回答
1

this[int] 和 this[int,int] 中计算的索引是_items数组中你需要的索引,这个数组从索引0开始。所以第二个item确实是index=1,也就是Orange。

更新:_items[-1] 不存在,这个数组从索引 0 开始。

于 2012-07-09T08:43:21.983 回答