【发布时间】: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 的切片与我当时的习惯完全不同。