2011-03-03 81 views
2

我有一個調用成員對象方法的方法。每種方法都會吐出一個字符串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

回答

3

在只需將兩個字符串放在一起的情況下,字符串+運算符(或等價的字符串.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

2

您可以使用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

0

這可能不再有效,但沒有提及。

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

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