为什么你需要首先将一个
StringBuilder
转换为
String
呢?正如你所提到的,你可以直接传递
StringBuilder
到 XNA 的绘图方法中。你也可以使用
StringBuilder
来检索子字符串:
substringBuilder.Length = 0
for (int i = start
substringBuilder.Append(originalBuilder[i])
只有 ToString()
和 AppendFormat()
是需要避免使用 StringBuilder
的。据我所知,其他格式化方法(如果有的话)都不会产生垃圾。 更新:我错了。自己编写扩展方法。你可以在这里找到一个概述:当使用 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;
}