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

这两种方法有什么区别?

一个比另一个更有效吗?

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

谢谢。

正如MSDN文档的备注部分中明确提到的那样

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

你的问题,

这两种方法有什么区别?

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

一个比另一个更有效吗?

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

如果Multiline属性设置为falseConcatenation(+ =)会产生更好的结果,但另一方面Multiline属性设置为True然后AppendText产生更好的性能。

编辑在阅读罗林的评论后,我制作了一个自定义的win-form解决方案,其中我有一个简单的textbox ,其中我使用简单的for-loop在其中附加了一个简单的字符串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(); } 

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

对于10000次迭代, btnAppendText_Click上的btnAppendText_Click输出为37222129几乎3-4秒
btnConcante_Click上的btnConcante_Click输出为14449906487超过25分钟,仅进行5000次迭代

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

测试2:多行属性是错误的

对于10000次迭代, btnConcante_Click上的btnConcante_Click输出为39862280几乎3-4秒
对于10000次迭代, btnAppendText_Click上的btnAppendText_Click输出为1043279672差不多2-3分钟

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

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

作为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分钟。