You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 - 1
  • length必须为非负整数,且满足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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:42:15