TextBox.Text + =“string”; vs TextBox.AppendText(“string”);

时间:2013-12-17 11:00:25

标签: c# winforms stringbuilder

这两种方法有什么区别?

一个比另一个更有效吗?

我想也许AppendText()使用类似于StringBuilder的方法,即它使用自己的缓存而不是每次创建和附加一个新字符串,是真的吗?

感谢。

3 个答案:

答案 0 :(得分:13)

正如Remarks section of MSDN Documentation

中明确提到的那样
  

AppendText方法使用户能够在不使用文本连接的情况下将文本附加到文本控件的内容,这可以在需要多个连接时产生更好的性能。

你的问题,

  

这两种方法有什么区别?

我们都知道TextBox.Text += something;将如何工作,即每次创建和追加新字符串,但AppendText如何工作我无法找到任何代码段,无论内部是否使用StringBuilder或其他内容

  

一个比另一个更有效吗?

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

  

如果 Multiline 属性设置为 false ,则连接(+ =)会产生更好的效果,但是另一方面 Multiline 属性设置为 True ,然后 AppendText 会产生更好的效果。

编辑阅读comment from Rawling后,我制作了一个自定义的win-form解决方案,其中我有一个简单的textbox,其中我添加了一个简单的字符串hello使用简单的for-loop

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();
    }

输出非常令人惊讶,
测试1:多行属性为真 我不得不将迭代次数减少到一半,即文本连接为5000,因为它说的很长时间

  btnAppendText_Click上的

txtTime输出 37222129 将近3-4秒进行10000次迭代   btnConcante_Click上的txtTime输出 14449906487 超过25分钟仅需5000次迭代

从上面的结果可以清楚地看出,AppendText更加快速有效(当MultilineTrue时)Concatenation

TEST 2:多行属性为false

  btnConcante_Click上的

txtTime输出 39862280 将近3-4秒进行10000次迭代   btnAppendText_Click上的txtTime输出 1043279672 将近2-3分钟进行10000次迭代

从上面的结果可以清楚地看出,连接更快更有效(当Multilinefalse时),然后AppendText

答案 1 :(得分:0)

AppendText与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);
      }
    }
  }
}

答案 2 :(得分:0)

作为dbw的补充(如果有人能找到我犯错误的地方),这是我的表现测试:

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;
}

我看到e1约3秒,e2约2分钟。