爲什麼您需要首先將StringBuilder
轉換爲String
?如您所知,您可以直接將StringBuilder
傳遞給XNA的繪圖方法。您還可以使用StringBuilder
檢索子:
substringBuilder.Length = 0;
for (int i = start; i <= end; i++)
substringBuilder.Append(originalBuilder[i]);
要避免與
StringBuilder
是
ToString()
和
AppendFormat()
唯一的東西。其他格式化方法(據我所知)都沒有產生垃圾。
更新:我錯了。編寫你自己的擴展方法。可以在這裏找到一個簡明的例子:Avoiding garbage when working with StringBuilder
編寫一個方法會比較容易,它會根據給定的分隔符將字符串拆分爲子字符串。請記住,String.Split()
是邪惡的兩個的原因 - 首先,因爲它分配新的字符串;第二,因爲它分配一個新的陣列。字符串的不變性只是你問題的一半。
請考慮以下擴展方法StringBuilder
。我沒有徹底測試過這個代碼,但它應該給你一個大概的想法。請注意,它期望您傳入預先分配的數組,然後它將填充。
public static void Substring(this StringBuilder source, Int32 start, Int32 count, StringBuilder output)
{
output.Length = 0;
for (int i = start; i < start + count; i++)
{
output.Append(source[i]);
}
}
public static int Split(this StringBuilder source, Char delimiter, StringBuilder[] output)
{
var substringCount = 0;
var substringStart = 0;
for (int i = 0; i < source.Length; i++)
{
if (source[i] == delimiter)
{
source.Substring(substringStart, i - substringStart, output[substringCount]);
substringCount++;
substringStart = i + 1;
}
}
if (substringStart < source.Length - 1)
{
source.Substring(substringStart, source.Length - substringStart, output[substringCount]);
substringCount++;
}
return substringCount;
}
只是一個側面說明芒果有Generational GC http://blogs.msdn.com/b/abhinaba/archive/2011/04/13/generational-gc-in-windows-phone-mango.aspx – Terrance
此外,這是一種使某些東西「更接近」可變字符串的方法http://stackoverflow.com/questions/6913435/how-to-get-a-list-of-mutable-strings – Terrance