什么是可以在.NET中创建的最长字符串?String
就我所见,该课程的文档对此问题保持沉默,因此权威性答案可能需要一些内部知识.64位系统的最大变化是什么?
[这更多是为了好奇而不是实际使用 - 我不打算创建任何使用巨大字符串的代码!]
理论极限可能是2,147,483,647,但实际限制远不及那个.由于.Net程序中没有单个对象可能超过2GB且字符串类型使用unicode(每个字符2个字节),所以你能做的最好是1,073,741,823,但是你不可能在32位机器.
这是"如果你不得不问,你可能做错了什么"的情况之一.
基于我高度科学和准确的实验,它在我的机器上达到了1,000,000,000个字符之前.(我仍在运行下面的代码以获得更好的精确定位).
更新:
几个小时后,我放弃了.最终结果:可以超过100,000,000个字符,立即System.OutOfMemoryException
以1,000,000,000个字符给出.
using System; using System.Collections.Generic; public class MyClass { public static void Main() { int i = 100000000; try { for (i = i; i <= int.MaxValue; i += 5000) { string value = new string('x', i); //WL(i); } } catch (Exception exc) { WL(i); WL(exc); } WL(i); RL(); } #region Helper methods private static void WL(object text, params object[] args) { Console.WriteLine(text.ToString(), args); } private static void RL() { Console.ReadLine(); } private static void Break() { System.Diagnostics.Debugger.Break(); } #endregion }
由于Length
属性System.String
为a Int32
,我猜测最大长度为2,147,483,647个字符(最大Int32
大小).如果允许的时间更长,则无法检查长度,因为这会失败.
对于那些迟到这个话题的人来说,我可以看到hitscan的"你可能不应该这样做"可能会让别人问他们应该怎么做......
该StringBuilder的类往往是一个易于更换.如果您的数据来自文件,请考虑其中一个基于流的类.
问题s += "stuff"
在于它必须分配一个全新的区域来保存数据,然后将所有旧数据复制到它以及新的东西 - 每个循环和每次循环迭代.因此,增加五个字节到1,000,000 s += "stuff"
是非常昂贵的.如果你想要的只是写五个字节到最后并继续你的程序,你必须选择一个留下一些增长空间的类:
StringBuilder sb = new StringBuilder(5000); for (; ; ) { sb.Append("stuff"); }
StringBuilder
当它受到限制时,它会自动增长一倍.因此,您将在开始时看到增长痛苦,一次是5,000字节,再次是10,000,再次是20,000.追加字符串会在每次循环迭代时产生痛苦.
字符串不受通常认为的整数限制.
除了内存限制,字符串不能超过2 30(1,073,741,824)个字符,因为Microsoft CLR(公共语言运行时)强加了2GB的限制.
希望这可能在未来发生变化.