【发布时间】:2015-12-30 14:44:00
【问题描述】:
.netSystem.String类中Substring()方法的定义是这样的
public string Substring(int startIndex)
根据方法定义,startIndex 是 “此实例中子字符串从零开始的起始字符位置”。如果我理解正确,这意味着它将给我字符串的一部分,从给定的从零开始的索引开始。
现在,如果我有一个字符串 "ABC" 并获取具有不同索引的子字符串,我会得到以下结果。
var str = "ABC";
var chars = str.ToArray(); //returns 3 char 'A', 'B', 'C' as expected
var sub2 = str.Substring(2); //[1] returns "C" as expected
var sub3 = str.Substring(3); //[2] returns "" ...!!! Why no exception??
var sub4 = str.Substring(4); //[3] throws ArgumentOutOfRangeException as expected
为什么它不会为 case [2] 抛出异常?
字符串有3个字符,所以索引是[0, 1, 2],甚至ToArray(),ToCharArray()方法也按预期返回3个字符!如果我尝试使用起始索引为3 的Substring(),它不应该抛出异常吗?
【问题讨论】:
-
可能是
\0字符(标记字符串的结尾)。但我不确定.NET 是否使用它。虽然值得谷歌 -
感谢@AlexK。和其他人(答案)指出实现和 MSDN 文档。我可以看到框架团队是这样实现的,但对我(以及我猜的其他少数人)来说,这有点出乎意料!
-
快速而肮脏的答案是:.NET 知道长度为 0 的字符串是什么意思,它不知道长度为 -1 的字符串是什么意思。
-
这个问题是否被关闭作为重复对用户是否可以在这里找到答案绝对没有影响。事实上,如果您仔细阅读 Atwood(和其他人的)关于重复的 cmets,“拥抱重复”概念的关键是问题仍然作为重复而关闭。只是保留它们有助于用户找到他们想要或需要的答案。
标签: c# .net string substring clr