C# TextBox.Text+;=&引用;字符串“;;vs TextBox.AppendText(“字符串”);

C# TextBox.Text+;=&引用;字符串“;;vs TextBox.AppendText(“字符串”);,c#,winforms,stringbuilder,C#,Winforms,Stringbuilder,这两种方法有什么区别 一个比另一个更有效率吗 我在想AppendText()可能使用了一种类似于StringBuilder的方法,即它使用自己的缓存,而不是每次都创建和追加一个新字符串,是这样吗 谢谢。附录文本与StringBuilder无关。Text方法实际上看起来更简单(可能性能更高)。参考这两种方法的源代码: public void AppendText(string text) { if (text.Length > 0) { int start;

这两种方法有什么区别

一个比另一个更有效率吗

我在想AppendText()可能使用了一种类似于StringBuilder的方法,即它使用自己的缓存,而不是每次都创建和追加一个新字符串,是这样吗


谢谢。

附录文本与StringBuilder无关。Text方法实际上看起来更简单(可能性能更高)。参考这两种方法的源代码:

public void AppendText(string text)
{
    if (text.Length > 0)
    {
        int start;
        int length;
        this.GetSelectionStartAndLength(out start, out length);
        try
        {
            int endPosition = this.GetEndPosition();
            this.SelectInternal(endPosition, endPosition, endPosition);
            this.SelectedText = text;
        }
        finally
        {
            if (base.Width == 0 || base.Height == 0)
            {
                this.Select(start, length);
            }
        }
    }
}


public override string Text {
  get {
    return base.Text;
  }
  set {
    if (value != base.Text) {
      base.Text = value;
      if (base.IsHandleCreated) {
        base.SendMessage(185, 0, 0);
      }
    }
  }
}

正如在

AppendText方法使用户能够将文本附加到文本控件的内容中,而无需使用文本连接,这在需要许多连接时可以产生更好的性能

你的问题,

这两种方法有什么区别

我们都知道如何
TextBox.Text+=something将起作用,即每次创建和追加一个新字符串,但
AppendText
的工作原理我找不到任何代码片段,无论它是在内部使用
StringBuilder
还是其他什么

一个比另一个更有效率吗

我认为上述问题的答案取决于具体情况,(基于测试用例观察)

如果
多行
属性设置为
,则串联(+=)产生更好的结果,但另一方面,
多行
属性设置为
,然后
追加文本
产生更好的性能

编辑阅读后,我制作了一个自定义win form解决方案,其中我有一个简单的
文本框
,其中我使用一个简单的
for循环
附加了一个简单的字符串
hello
10000次

    private void btnAppendText_Click(object sender, EventArgs e)
    {
        txtText.Text = string.Empty;
        DateTime startTime = DateTime.Now;
        for (int i = 0; i < 10000; i++)
        {
            txtText.AppendText(s);
        }
        DateTime endTime = DateTime.Now;
        txtTime.Text = (endTime.Ticks - startTime.Ticks).ToString();
    }

    private void btnConcante_Click(object sender, EventArgs e)
    {
        txtText.Text = string.Empty;
        DateTime startTime = DateTime.Now;
        for (int i = 0; i < 5000; i++)
        {
            txtText.Text += s;
        }
        DateTime endTime = DateTime.Now;
        txtTime.Text = (endTime.Ticks - startTime.Ticks).ToString();
    }
private void btnAppendText\u单击(对象发送者,事件参数)
{
Text=string.Empty;
DateTime startTime=DateTime.Now;
对于(int i=0;i<10000;i++)
{
txtText.追加文本;
}
DateTime endTime=DateTime.Now;
Text=(endTime.Ticks-startTime.Ticks).ToString();
}
私有void btnConte\u单击(对象发送者,事件参数)
{
Text=string.Empty;
DateTime startTime=DateTime.Now;
对于(int i=0;i<5000;i++)
{
txtText.Text+=s;
}
DateTime endTime=DateTime.Now;
Text=(endTime.Ticks-startTime.Ticks).ToString();
}
产出非常令人惊讶,
测试1:多行属性为真 我不得不将文本连接的迭代次数减少到一半,即5000次,因为这需要很长时间

btnAppendText\u点击
txtTime
上的
输出为
37222129
大约3-4秒,重复10000次
btnConte\u单击
txtTime
上的输出时间
14449906487
超过25分钟,只有5000次迭代

从以上结果可以清楚地看出,
AppendText
串联
更快、更高效(当
多行
真时)

测试2:多行属性为false

btnConte\u点击
txtTime
上的输出
39862280
大约3-4秒,重复10000次
btnAppendText\u点击
txtTime
上的
输出
1043279672
大约2-3分钟,重复10000次


从以上结果可以清楚地看出,作为对
dbw
的补充,连接比
AppendText
更快、更有效(如果有人能找到我犯了错误的地方),下面是我的性能测试:

private void Form1_Click(object sender, EventArgs e)
{
    Stopwatch sw = new Stopwatch();

    sw.Reset();
    textBox1.Text = "";
    sw.Start();
    for (int i = 0; i < 10000; i++)
    {
        textBox1.Text += s;
    }
    sw.Stop();
    var e1 = sw.Elapsed;

    sw.Reset();
    textBox1.Text = "";
    sw.Start();
    for (int i = 0; i < 10000; i++)
    {
        textBox1.AppendText(s);
    }
    sw.Stop();
    var e2 = sw.Elapsed;
}
private void Form1\u单击(对象发送方,事件参数e)
{
秒表sw=新秒表();
sw.Reset();
textBox1.Text=“”;
sw.Start();
对于(int i=0;i<10000;i++)
{
textBox1.Text+=s;
}
sw.Stop();
var e1=经过的时间;
sw.Reset();
textBox1.Text=“”;
sw.Start();
对于(int i=0;i<10000;i++)
{
textBox1.追加文本;
}
sw.Stop();
var e2=经过的时间;
}

我看到
e1
大约需要3秒,而
e2
大约需要2分钟。

在反射器中查看它,AppendText只是通过计算结束位置然后添加via来进行追加。SelectedTextDocumentation:当然,这可以被认为与使用StringBuilder相比+=,从中获得的好处类似,当需要很多连接时?MSDN文档实际上是垃圾<代码>追加文本
并不比串联更有效。我运行了一个性能测试,
.Text+=
快了一个数量级。AppendText
@Rawling.Text+=不快请参见我的编辑answer@Rawling您的计算机上或测试用例中是否有其他内容,我正在使用.net framework 4客户端配置文件上的Windows应用程序,您能提供一些关于您的测试用例的详细信息吗?@dbw我已经尝试尽可能地复制您的测试(切换到.NET 4客户机配置文件,切换到使用类变量而不是字符串文本,添加5个字符而不是1个,循环10k而不是1k次)我的
+=
循环仍然需要3分钟才能完成,而我的
AppendText
运行了大约2分钟。我猜MSDN文档并不是完全的垃圾-可以说它可以产生更好的性能,因为您已经看到了它但我很想知道为什么我们会看到如此相反的结果。与所有性能问题一样,OP可以根据自己的实际使用情况进行分析!我可能错了,但它甚至没有出现