为什么结合调用 AppendLine 和 Length of StringBuilder 会在 WinForm 的 TextBox 中产生奇怪的结果?

Why combining calls to AppendLine and Length of StringBuilder produce strange results with WinForm's TextBox?

我在练习 windows 表格。

这本书最近教了StringBuilder,所以我打了这本书的例子。

示例代码为

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp32
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder str1;
            str1 = new StringBuilder(5);
            str1.Append("1234");
            textBox1.AppendText("Capacity=" + str1.Capacity.ToString() + "\r\n");
            str1.Append("5768");
            textBox1.AppendText("str1=" + str1.ToString() + "\r\n");
            textBox1.AppendText("Length=" + str1.Length.ToString() + "\r\n");

            str1.Length = 15;
            textBox1.AppendText("Capacity=" + str1.Capacity.ToString() + "\r\n");
            textBox1.AppendText("Length=" + str1.Length.ToString() + "\r\n");
            textBox1.AppendText("str1=" + str1.ToString() + "\r\n");

            str1.Clear();
            str1.Append("123");
            textBox1.AppendText("str1=" + str1.ToString() + "\r\n");

        }

       
    }
}

当它显示在 FormsApp 上时,它看起来像这样:

str1=123没换行,

所以我在"str1=" + str1.ToString() + "\r\n"前面加了"\r\n"

这样做之后,FormsApp 显示如下:

我的问题是:

我在之前的AppendText中已经有"\r\n"了。

使用 Clear() 和 Append() 方法后,

为什么 str1=123 没有自动换行?

................................................ ......

将 Append() 更改为 AppendLine() 后,

FormsApp 显示如下:

我只把str1.Append("123");改成了str1.AppendLine("123"+"\r\n"),没用。

我怀疑大多数评论者都没有详细阅读代码,因此没有意识到您所有附加到文本框的内容 已经 包含换行符。

所以 - 他们为什么不显示?

您 运行 变成了 Null character deleting rest of output in TextBox and RichTextBox 的变体。基本上,如果您将文本插入文本框,那么 NULL 字符之后的任何内容都会被删除。

但是NULL这个字符是从哪里来的呢?

嗯,它来自 StringBuilder(当您明确将 Length 设置为大于当前长度时)。根据 the docs:

If the specified length is less than the current length, the current StringBuilder object is truncated to the specified length. If the specified length is greater than the current length, the end of the string value of the current StringBuilder object is padded with the Unicode NULL character (U+0000).

现在,由于您在 NULL 字符 之后插入了换行符 NULL 字符,因此实际上换行符在您第二次调用

时丢失了
textBox1.AppendText("str1=" + str1.ToString() + "\r\n");

最简单的解决办法是注释掉:

str1.Length = 15;

避免 NULL 个角色首先到达那里。