官方回答
为了获得更好的可见性,以下是Mads Torgersen的评论,解释了C#8博客文章中的这一设计决策:
在开始和结束算法方面,我们决定遵循Python。 0
指定第一个元素(一如既往),并 ^0
指定“ length'th”元素,即最后一个元素。这样,您将获得一个简单的关系,其中元素从开始的位置加上其从结束的位置等于长度。 如果您自己进行数学运算,则 x
in ^x
是从长度中减去的值。
为什么不使用减号(-
)而不是新的帽子(^
)运算符?这主要与范围有关。再次与Python和大多数行业保持一致,我们希望我们的范围在开始时就包括所有内容,而在结尾时要包含所有内容。您传递的要说范围应该一直到最后的索引是什么?在C#中,答案很简单:x..^0
从头到尾 x
。在Python中,没有可以提供的显式索引:-0
不起作用,因为它等于0
第一个元素!因此,在Python中,您必须完全不使用end索引来表示到达末尾的范围:x..
。如果计算了范围的末尾,那么您需要记住要有特殊的逻辑,以防万一0
。正如x..-y
,在那里y
被计算出来了0
。这是常见的麻烦和错误源。
最后,请注意,索引和范围是.NET / C#中的第一类类型。它们的行为不依赖于它们的应用,甚至不用于索引器。您可以完全定义自己的使用Index的索引器,以及定义另一个使用的索引器Range
–我们将在eg中添加这样的索引器 Span
。但是,例如,您也可以使用采用范围的方法。
我的答案
我认为这与我们习惯的经典语法相匹配:
value[^1] == value[value.Length - 1]
如果使用0,则两种语法并排使用时会造成混淆。这样,它具有较低的认知负荷。
其他语言(例如Python)也使用相同的约定。
[beginInclusive, endExclusive)
。这是一个常见的约定。