这是主要的课程
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指数,即橙色。
请清除我的怀疑。
答案 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)