C#中调用Substring截取零长度子串时为何不抛出异常?
string jgh = "n"; string fff = jgh.Substring(1, 0);
原因说明
首先直接给结论:字符'n'和字符串结尾引号之间没有任何隐藏内容,这个表现是.NET中String.Substring方法的刻意设计,不是运行时bug,也不是字符串里存了未被发现的字符。
方法的参数校验规则
Substring(int startIndex, int length)对参数的合法边界判定如下:
startIndex的合法取值范围是0到字符串.Length的闭区间,不是多数人直觉里的0到字符串.Length - 1length必须为非负整数,且满足startIndex + length <= 字符串.Length
你的测试场景里,jgh.Length是1,传入的startIndex=1、length=0,刚好满足1+0=1 <= 1的校验条件,所以不会抛出索引越界异常,最终返回空字符串。
如果把length改成1,就会触发1+1=2 > 1的校验失败,直接抛出ArgumentOutOfRangeException,这才是大家认知里的越界场景。
背后的设计逻辑
这个边界设计是为了对齐字符串的「插入点」抽象:你可以把长度为N的字符串想象成N个字符排成一列,字符之间、首尾两端总共有N+1个可以插入内容的间隙,这些间隙的索引就是从0到N。
允许在索引等于字符串长度的位置截取长度为0的子串,本质就是认可「字符串末尾间隙」是合法位置,这样做可以减少很多业务代码里的冗余边界判断:比如循环逐段截取字符串、做字符串拼接操作时,不需要额外写if判断当前起始位置是不是刚好到了字符串末尾,直接调用方法就能拿到合法的空串结果,不用单独处理边界分支。
你如果怀疑有隐藏字符,可以直接打印jgh.Length验证,结果必然是1,遍历字符串的所有字符也只能拿到'n'这一个元素,不存在额外内容。
内容的提问来源于stack exchange,提问作者Jason9789
相关产品推荐
相关产品推荐

