1

使用长字符串并发现此问题。有什么建议吗?

我有一个字符串生成器的容量为 1024 且长度为 992 的实例。

我是 .Append() 一个字符串,它的 .Length 属性为 1024。

调用 .Append() 后,.ToString() 方法返回一个长的 "\0\0\0" 字符串。

到底是怎么回事?0.o

如果我创建一个新的 StringBuilder 对象然后追加,我会得到我所期望的。所以字符串“应该”没问题吧?

(我通过执行 .Remove(0, LengthofSB) 技巧来清除字符串生成器)。

有任何想法吗?

4

2 回答 2

3

在我看来,原始数据StringBuilder是“\0\0\0\0\0...”,这就是你所看到的——如果你能看到字符串的末尾,你就会看到你的真实数据数据。

各种 Windows 控件在看到“\0”时将其截断,因为它们将其视为字符串终止字符,从而加剧了这种情况。

如果你有一个简短但完整的程序来演示这个问题,我们可以证实我的怀疑。

于 2009-12-30T08:05:56.320 回答
0

尽我所能从我尝试运行以下代码的问题中得出结论。如果没有您上面提到的字符串“\0\0\0”,它就可以正常工作。我已经发布了下面的代码。请注意,因为您没有提供您的工作方式,我只是认为您正在尝试这样的事情。另外,我只是创建了两个 1024 字符串,其中一个字符串充满了“a”和另一个“b”,并将它们加入到第一个 stringbuilder 对象中。它工作得很好。

StringBuilder sb1 = new StringBuilder(1024);
for (int i = 0; i < 992; i++)
    sb1.Append('a');
Console.WriteLine(sb1.ToString());
Console.WriteLine("{0}",sb1.Length);

StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < 1024; i++)
    sb2.Append('b');
Console.WriteLine(sb2.ToString());
Console.WriteLine("{0}",sb2.Length);

sb1.Append(sb2.ToString());
Console.WriteLine(sb1.ToString());
Console.WriteLine("{0}",sb1.Length);
于 2009-12-30T10:16:17.920 回答