为什么您需要首先将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