这两种方法有什么区别?
一个比另一个更有效吗?
我想也许AppendText()使用类似于StringBuilder的方法,即它使用自己的缓存而不是每次创建和附加一个新字符串,是真的吗?
感谢。
答案 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
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
更加快速有效(当Multiline
为True
时)Concatenation
TEST 2:多行属性为false
btnConcante_Click
上的
txtTime
输出39862280
将近3-4秒进行10000次迭代btnAppendText_Click
上的txtTime
输出1043279672
将近2-3分钟进行10000次迭代
从上面的结果可以清楚地看出,连接更快更有效(当Multiline
为false
时),然后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分钟。