我应该使用StringBuilder来连接两个大字符串吗?

问题描述:

我有一个调用成员对象方法的方法。每种方法都会吐出一个字符串HTML表单。表单字符串可能会变得很大。我知道我会在这里只处理2个成员对象。简单地连接每个返回值或者我应该在这里使用StringBuilder是否表现良好?我应该使用StringBuilder来连接两个大字符串吗?

public override string RenderForm() 
    { 
     return _form1.RenderForm() + _form2.RenderForm(); 
    } 
+1

这在我看来是一个堆栈溢出问题 – 2011-03-03 20:40:03

+0

@Winston:同意,现在迁移它。 – 2011-03-03 20:46:25

在只需将两个字符串放在一起的情况下,字符串+运算符(或等价的字符串.Concat(字符串,字符串))就好了,无论字符串有多长。

如果这是一个大型树结构的一部分,其中许多部分被组装到其他对象中(这就是问题似乎暗示的),那么更好的方法可能是将StringBuilder实例传递给每个组件。

public override void RenderForm(StringBuilder result) 
{ 
    _form1.RenderForm(result); 
    _form2.RenderForm(result); 
} 

.... 

public override void RenderForm(StringBuilder result) 
{ 
    result.Append("<span class='FormName'>"); 
    result.Append(_formName); 
    result.Append("</span>");   
} 

这将需要修改层次结构中的所有组件,但它可能会改善内存分配。

+0

Yads的答案和你的都很好,但你的更符合复合材料这正是我正在处理的。在这种情况下,没有足够复杂的树来保证传递一个StringBuilder - 但是如果有的话我会接受你的建议并且重载RenderForm()。 – HAL9000 2011-03-03 21:23:46

您可以使用string.Concat(_form1.RenderForm(), _form2.RenderForm())

虽然这是我的理解C#编译器将你的代码转换成string.Concat呼叫反正。

这个page对不同的方法有很好的性能分析。

+0

一个确凿的答案。如果我重写了两个成员类型的ToString()来呈现表单字符串,Concat会在另一方面有用,因为Concat会在每个项目上调用ToString()。实际上,在成员上使用ToString将会是一种更好的模式,如果HTML表单是仅将**成员表示为字符串的方式。 [MSDN Concat(obj,obj)](http://msdn.microsoft.com/en-us/library/kbseaaft.aspx) – HAL9000 2011-03-03 20:46:23

这可能不再有效,但没有提及。

你也可以使用的String.Format()

public override string RenderForm() 
{ 
    return String.Format("{0}{1}", _form1.RenderForm(), _form2.RenderForm()); 
}