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
相关产品推荐
相关产品推荐

