【问题标题】:Why C# substring uses length instead of endIndex?为什么 C# 子字符串使用长度而不是 endIndex?
【发布时间】:2021-11-23 14:22:08
【问题描述】:

我已经习惯了Substring()(以及一般的切片操作)在其他编程语言中的工作方式——你传入两个参数,一个用于起始索引,一个用于结束索引,然后是开始之间的所有元素并且将选择结束(包括开始,不包括结束)。例如 Python3 中的 range() 或 Java 中的 substring()

然而,在 C# 中,Substring() 方法、用于数组的 Clear() 方法以及许多其他涉及切片的方法都要求切片的起始索引和 长度

因此,每当我用 C# 编写代码时,我都不会在那种“模式”中思考。我仍然希望它采用开始和结束索引。在调用Substring() 之类的方法时,我必须通过length = end - start + 1 在心理上转换参数。这有点不舒服。

在我看来,当我进行这些类型的“转换”时,我是“错误的”;也许我应该以更“C#-ish”的模式思考。

  • 有谁知道为什么 C# 以这种方式实现字符串/数组切片?
  • 有没有更好的方法让我的思维适应 C# 的方法?

谢谢。

【问题讨论】:

  • 可能来自 C 遗产,将其视为跨度...偏移量和长度。很常见
  • 我不认为这是基于意见的。如果有人找到有关微软为何如此决定的文档,那就是事实。
  • 与 C# 无关,这是框架设计者的设计选择。这必须让多种语言保持愉快并保持一致。虽然今天已解决,但 (start,end) 范围是包含还是排除的歧义是痛苦的,包含是 1989 年的规范。由大量用 Basic 编写的代码驱动,通常从 1 而不是 0 索引,并带有 For - 包含最终值的语句。在 (offset,count) 上设计 api 避免了很多错误。
  • 同意@HansPassant。 .NET 最初是为 VB.Net 和 C# 设计的,然后随着时间的流逝而出现(和一些消失)的其他语言。我倾向于回想起“pre-dotNET”Visual Basic 中的Substring 就是这样完成的。它当然也与“pre-VB”BASIC 的mid$ 实现一致。 Substring 使用长度几乎可以肯定是为了使代码尽可能地从 Visual Basic 移植,这是 Microsoft 在此过渡期间的明确目标。我记得 Python 的切片与我当时的习惯完全不同。

标签: c# indexing slice


【解决方案1】:

我无法说出“为什么”,因为这是微软制定的实施细节,而“微软当时在想什么”之类的问题通常是题外话。

..但我确实想指出现代 C# 具有“开始和结束索引”功能。我们将它们称为range operator,它看起来像:

[start..end]

例如

Console.WriteLine("Hello World"[1..^1]);

将打印

ello Worl

如果您将它们视为字符之间的无形间隙:

 H e l l o   W o r l d
0 1 2..         ..2 1 0

然后你会在开始 1 和结束 1 之间使用一个字符串切开(插入符号 ^ 表示结束)。其他例子:

[1..4] //start 1 and start 4
[^5..^2] //end 5 to end 2

它们也适用于数组,您可以省略数字并将其视为 0;玩一玩,看看它对你的思维导图有什么影响?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2015-02-03
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多