当前位置: 首页 > 知识库问答 >
问题:

为什么来自C#8数组切片功能的新hat操作符索引不从0开始?

梁丘波
2023-03-14

C#8.0引入了一种方便的数组切片方法——请参阅官方C#8.0博客文章。

访问数组最后一个元素的语法是

var value = new[] { 10, 11, 12, 13 };

int a = value[^1]; // 13
int b = value[^2]; // 12

我想知道为什么向后访问元素的索引从1开始,而不是0?这有技术原因吗?

共有1个答案

步炯
2023-03-14

为了更好的可见性,以下是Mads Torgersen在C#8博客文章中解释这一设计决定的评论:

当涉及到从开始和从结束算术时,我们决定遵循Python。

为什么不使用减号(-)来代替新的hat(^)运算符呢?这主要与范围有关。同样,为了与Python和大多数行业保持一致,我们希望我们的范围在开始时具有包容性,在结束时具有排他性。你传递的指数是什么来表示一个范围应该一直到最后?在C#中,答案很简单:x...^0

最后,请注意,索引和范围是中的第一类类型。净/碳#。它们的行为与它们所应用的对象无关,甚至与它们在索引器中的使用无关。你可以完全定义你自己的索引器来获取索引和另一个获取范围的索引器,我们将把这样的索引器添加到。

我认为这与我们使用的经典语法相匹配:

value[^1] == value[value.Length - 1]

如果它使用0,那么当这两个语法同时使用时,就会产生混淆。这样,它的认知负荷较低。

Python等其他语言也使用相同的约定。

 类似资料:
  • 本文向大家介绍python numpy数组的索引和切片的操作方法,包括了python numpy数组的索引和切片的操作方法的使用技巧和注意事项,需要的朋友参考一下 NumPy - 简介 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric,即 NumPy 的前身,是由 Jim Hugunin 开

  • 问题内容: C语言约定从0开始计数数组索引。为什么inode编号从1开始而不是0? 如果保留索引节点0供某些特殊用途,那么索引节点0的意义是什么? 问题答案: 通常,保留索引节点0,因为返回值0通常表示发生错误。Linux内核中的多种方法(尤其是在所有文件系统共享的VFS层中)均返回ino_t,例如find_inode_number。 还有更多保留的索引节点号。例如在ext2中: 和EXT3有:

  • 问题内容: 为什么执行速度比切片慢? 令人惊讶的是,即使包括长度计算在内,切片仍然明显更快: 注意:此行为的第一部分已在 Python的数据分析 (第3章)中进行了说明,但未提供任何解释。 。 如果有帮助:这是;的C代码。这是输出: 问题答案: __可以通过考虑操作员完成工作所需的时间来解释 某些 性能差异: 差的另一部分可以通过以下事实来解释是一个 函数 ,和甚至无操作函数调用需要一点时间: 这

  • 问题内容: 我一直在阅读Go,并为这个基本问题感到困惑。 在Go中,很明显,切片更灵活,并且在需要一系列数据时通常可以代替数组使用。 阅读了大多数文档,他们似乎鼓励开发人员只使用切片而不是数组。我得到的印象是,创建者可以简单地将数组设计为可调整大小的,而无需整个切片部分即可完成。实际上,这样的设计会使该语言更易于理解,甚至鼓励使用更多惯用的代码。 那么,为什么创建者首先要允许数组呢?什么时候可以使

  • 问题内容: 如何运作: 这个也是: 但这不是: 它惊慌于: 编辑:总的来说,我想做的是获取一个未知类型的结构,切片该类型的结构并返回指向它的指针(我使用的是github.com/jmoiron/modl指向要用SQL查询结果填充的切片的指针)。 问题答案: 接受,并且到的值不能用于更改原始值。否则,当您甚至不打算向其传递指针时,您可能最终会在代码中更改数据。(或者,在这种情况下,更改按值传递的切片

  • 问题内容: 在Java的其他任何地方,任何带有索引的内容都从0开始。这里是否有进行更改的原因,或者这只是不良的设计? 问题答案: 历史上,数据库对绑定参数使用基于1的索引。这可能反映了关系数据库在集合论和数学中的起源,即索引元素以1开头,并使用零表示空集或空集。 在shell脚本和正则表达式中,零索引通常表示“特殊”。例如,对于shell脚本,第零个“参数”实际上是被调用的命令。 JDBC的选择是