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

C# Substring方法设置第二个参数时出错,请求排查原因

C# Substring传入第二个参数报错的原因

我尝试从HTTP请求返回的字符串中截取部分内容,需求为从索引17的位置截取至字符串长度减3的位置。以下是我的C#实现代码:

var response = await responseURI2.Content.ReadAsStringAsync();
Debug.WriteLine(response);
Debug.WriteLine(response.GetType());
Debug.WriteLine(response.Length);
int length = (response.Length) - 3;
Debug.WriteLine(length);
try{
    var zero = response.Substring(17, length);
    Debug.WriteLine(zero);
}
catch
{
    Debug.WriteLine("Not able to do substring");
}

运行后输出如下:

[0:] "dshdshdshdwweiiwikwkwkwk..."
[0:] System.String
[0:] 117969
[0:] 117966
[0:] Not able to do substring

目前发现仅调用response.Substring(17)时可正常运行,但传入第二个参数后就会报错,请问该问题的原因是什么?


问题原因

C#里string.Substring(int startIndex, int length)的第二个参数是要截取的字符数量,不是结束索引。你的代码错误地把「字符串长度减3」当成了截取长度,导致超出字符串可用范围:

  • 原字符串总长度为117969,从索引17开始,剩余的字符数是 117969 - 17 = 117952
  • 你传入的第二个参数是117966,远大于剩余字符数,触发了参数越界异常,因此进入catch分支。

而Substring(17)是从索引17开始直接截取到字符串末尾,不需要指定长度,所以不会报错。

正确实现

要满足从索引17截取到字符串长度减3的位置,正确的截取长度应该是 总长度 - 3 - 起始索引,代码示例:

var zero = response.Substring(17, response.Length - 3 - 17);

也可以先截取到末尾,再移除最后3个字符,写法更直观:

var endPart = response.Substring(17);
var zero = endPart.Remove(endPart.Length - 3);

内容的提问来源于stack exchange,提问作者WakiApi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:18:33