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这样的其他语言也使用相同的约定.