“indexer”在这个例子中是如何工作的?

时间:2012-07-09 08:39:26

标签: c# .net

这是主要的课程

 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”

中定义了multiDimensional索引器

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

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

请清除我的怀疑。

4 个答案:

答案 0 :(得分:4)

这是私有数组_items

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

这是使用索引器的方式:

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

_lowerbound的值为-2

     

所以这意味着,返回的值应为_items[-1 - (-2)],这使得_items[1]

这是正确的。

  

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

那是错的。它指向_items[1],即橙色。

索引器是一种允许类像数组一样使用的简单方法。在内部,您可以以任何方式管理所呈现的值。

_items是一个从零开始的数组,其长度与创建的MyArray对象相同。

索引器只是解释提供的索引号并将其映射到此底层数组。

答案 1 :(得分:2)

这不是一个多维数组in the expected sense,它只是一个。

更新答案:

您希望: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)。

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

采用两个参数的第二个索引器是进行相同的索引修改,因此将导致相同的元素(橙色)......

混淆在哪里?你期待第二个参数......

lowerBound

...以某种方式影响返回的元素?它在序号public string this[int word, int position] 返回的元素的Substring调用中使用,影响选择的元素。

答案 2 :(得分:1)

在这个[int]中计算的索引和这个[int,int]是_items数组中你需要的索引,这个数组从索引0开始。所以第二项确实是index = 1,是橙色。

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

答案 3 :(得分:1)

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

为了避免这种情况,此数组类将具有最低索引(索引为_lowerBound)的项目移动到0.因此,当您访问内部数组时,您必须从中删除_lowerBound索引,所以永远不会尝试传递否定索引。

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

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

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