为何StringBuilder搭配WinForm的TextBox使用时出现换行异常?
问题原因
你遇到的换行异常和StringBuilder的Clear()、Append()方法没有关系,核心问题出在str1.Length = 15这行代码的副作用:
- 当你把
StringBuilder的Length属性设置为大于当前实际字符数时,超出的部分会自动用'\0'(空字符)填充。 - WinForm的
TextBox控件渲染字符串时,会把'\0'识别为字符串终止符,'\0'之后的所有内容(包括你追加的\r\n)都会被截断,不会渲染显示。
你前序最后一次AppendText输出的内容结构为:str1=12345768 + 7个'\0' + \r\n,TextBox只会渲染到12345768,后面的\r\n根本没有显示,也不会产生换行效果,因此下一次输出的str1=123就直接接在了前序显示内容的末尾。
你把Append改为AppendLine依然无效,是因为这个改动只修改了StringBuilder内部的内容,没有解决TextBox截断尾部换行的本质问题。
解决方法
- 移除非必要的
str1.Length = 15代码:StringBuilder会自动处理容量扩容,不需要手动设置Length属性,从根源避免尾部产生空字符。 - 输出前清理空字符:如果业务场景确实需要手动设置
StringBuilder的Length,输出到TextBox前先把字符串中的空字符剔除,示例代码:
// 所有输出到TextBox的字符串都做一次空字符替换 textBox1.AppendText(("str1=" + str1.ToString()).Replace("\0", string.Empty) + "\r\n");
- 正确使用
AppendLine:该方法会自动追加系统适配的换行符,不需要额外拼接\r\n,正确写法为str1.AppendLine("123")。
内容的提问来源于stack exchange,提问作者Jacky
相关产品推荐
相关产品推荐

