.NETstring的最大可能长度是多less?

什么是可以在.NET中创build的最长的string? String类的文档在这个问题上是无声的,所以一个权威的答案可能需要一些关于内部的知识。 将在64位系统上的最大变化?

[这是比实际使用更好奇的问题 – 我不打算创build任何使用巨大string的代码!]

理论上的限制可能是2,147,483,647,但实际的限制远不止于此。 由于.Net程序中没有单个对象可能超过2GB,并且stringtypes使用unicode(每个字符2字节),所以您可以做的最好的是1,073,741,823,但是您不可能将其分配给32位机器。

这是“如果你不得不问,你可能做错了”的情况之一。

基于我的高度科学和准确的实验,它在我的机器上达到了10亿个字符之前(我仍在运行下面的代码以获得更好的精确度)。 更新:几个小时后,我放弃了。 最终结果:可能会比100,000,000个字符多得多,立即给出10亿个字符的System.OutOfMemoryException。

 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 } 

由于System.String的Length属性是一个Int32,我猜测最大长度将是2,147,483,647个字符(最大Int32大小)。 如果它允许更长的时间,你不能检查长度,因为这将失败。

对于任何人来说这个话题迟到,我可以看到hitscan的“你可能不应该这样做”可能会导致有人问他们应该做什么…

这个StringBuilder类通常是一个简单的replace。 考虑一个基于stream的类,特别是如果你的数据来自一个文件。

s = s +“stuff”的问题是它必须分配一个全新的区域来保存数据,然后将所有的旧数据加上新的东西 – 每一个和每一个循环迭代。 所以用s = s +“stuff”加上5个字节到100万是非常昂贵的。 如果你想要的只是写5个字节到最后,继续你的程序,那么你必须select一个类,留下一些增长空间。

 StringBuilder sb = new StringBuilder(5000); for (; ; ) { sb.Append("stuff"); } 

StringBuilder将自动增长倍数,当它被限制击中。 所以你会在开始时看到一次增长的痛苦,一次是5000字节,又一次是10000,再次是20000.附加string会在每次循环迭代时产生痛苦。

string不受整体的限制,正如通常所认为的那样

除了内存限制之外,由于Microsoft CLR(公共语言运行时)强加2GB限制,因此string不能超过2 30 (1,073,741,824)个字符。

希望这在将来可能会改变。

200 megs …在这一点上,你的应用程序磨合到一个虚拟的暂停,大约有一个工作集内存,并且o / s开始行动,就像你需要重新启动。

 static void Main(string[] args) { string s = "hello world"; for(;;) { s = s + s.Substring(0, s.Length/10); Console.WriteLine(s.Length); } } 12 13 14 15 16 17 18 ... 158905664 174796230 192275853 211503438 

由于String.Length是一个整数(这是Int32的别名),其大小限制为Int32.MaxValue unicode字符;)

请注意,BinaryWriter.Write(string)将string长度写为无符号字符(一个字节)!