Mic*_*ino 149 c# arrays indexing c#-8.0
C#8.0引入了一种切片阵列的便捷方法 - 参见官方C#8.0博文.
访问数组的最后一个元素的语法是
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Run Code Online (Sandbox Code Playgroud)
我想知道为什么向后访问元素的索引从1开始而不是0?这有技术原因吗?
Mar*_*und 165
为了更好的可见性,Mads Torgersen发表了一篇评论,解释了C#8博客文章中的这一设计决定:
当涉及到从头开始和从头算术时,我们决定遵循Python.
0
指定第一个元素(一如既往)和^0
"长度"元素,即一个直接结束的元素.这样你就可以得到一个简单的关系,其中元素从开始的位置加上它从末尾的位置等于长度.在x
中^x
是什么,你会从长度减去如果你自己做的数学.为什么不使用minus(
-
)而不是new hat(^
)运算符?这主要与范围有关.再次与Python和大多数行业保持一致,我们希望我们的范围在开始时是包容性的,最后是独占的.你传递的索引是什么,说一个范围应该一直到最后?在C#中,答案很简单:x..^0
从最后x
到最后.在Python中,没有明确的索引可以给出:-0
不起作用,因为它等于0
第一个元素!所以在Python中,你必须完全抛弃结束索引来表达一个结束的范围:x..
.如果计算了范围的结尾,那么你需要记住具有特殊逻辑以防万一0
.如在x..-y
,y
计算和出来的地方0
.这是一个常见的麻烦和错误来源.最后,请注意索引和范围是.NET/C#中的第一类类型.它们的行为与它们应用的内容无关,甚至不能用于索引器.您可以完全定义自己的索引器,它接受索引和另一个索引
Range
- 我们将添加这样的索引器,例如Span
.但是,您也可以使用采用范围的方法.
我认为这是为了匹配我们习惯的经典语法:
value[^1] == value[value.Length - 1]
Run Code Online (Sandbox Code Playgroud)
如果它使用0,那么当并排使用这两种语法时会很混乱.这样它具有较低的认知负荷.
像Python这样的其他语言也使用相同的约定.