.NET字符串的最大可能长度是多少?

在。net中可以创建的最长字符串是什么?据我所知,String类的文档对这个问题保持沉默,所以权威的答案可能需要一些内部知识。64位系统的最大变化是多少?

[这个问题更多的是出于好奇而不是实际用途——我不打算创建任何使用巨大字符串的代码!]

393772 次浏览

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

因为String.Length是一个整数(这是Int32的别名),它的大小被限制为Int32.MaxValue unicode字符。;-)

根据我高度科学和精确的实验,它在我的机器上达到了10亿个字符。(我仍在运行下面的代码以获得更好的精确位置)。

< >强更新: 几个小时后,我放弃了。最终结果:可以比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
}

理论上的极限可能是2147,483,647,但实际的极限远不及此。由于. net程序中的单个对象不可能超过2GB,并且字符串类型使用UTF-16(每个字符2字节),所以您最多可以做到1,073,741,823,但是您不太可能在32位计算机上分配它。

这是“如果你还得问,那你可能做错了什么。”

200 mb……这时,你的应用程序会陷入虚拟停顿,只有大约gig的工作集内存,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

对于那些晚到这个话题的人来说,我可以看到hitscan的“你可能不应该这样做”可能会让一些人问他们应该怎么做……

StringBuilder类通常是一个简单的替换。 如果你的数据来自一个文件,特别考虑基于流的类中的一个 s += "stuff"的问题是它必须分配一个全新的区域来保存数据,然后将所有旧数据复制到它加上新数据-每一次循环迭代。因此,使用s += "stuff"将5个字节添加到1,000,000是非常昂贵的。 如果您希望只写5个字节到末尾并继续执行程序,则必须选择一个留有一些增长空间的类:

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

当达到极限时,StringBuilder将会自动增长加倍。所以,你会在开始时看到增长的痛苦,一次是5000字节,一次是10000字节,一次是20000字节。追加字符串将在每次循环迭代中引起痛苦。

字符串在我的机器上的最大长度是1073741791年

你看,字符串并不像通常认为的那样受整数限制。

除了内存限制外,字符串不能有超过230. (1073741824年)字符,因为微软CLR(公共语言运行时)施加了2GB的限制。比我电脑允许的多33个。

现在,这里有一些东西欢迎你自己尝试。

在Visual Studio中创建一个新的c#控制台应用程序,然后复制/粘贴main方法:

static void Main(string[] args)
{
Console.WriteLine("String test, by Nicholas John Joseph Taylor");


Console.WriteLine("\nTheoretically, C# should support a string of int.MaxValue, but we run out of memory before then.");


Console.WriteLine("\nThis is a quickish test to narrow down results to find the max supported length of a string.");


Console.WriteLine("\nThe test starts ...now:\n");


int Length = 0;


string s = "";


int Increment = 1000000000; // We know that s string with the length of 1000000000 causes an out of memory exception.


LoopPoint:


// Make a string appendage the length of the value of Increment


StringBuilder StringAppendage = new StringBuilder();


for (int CharacterPosition = 0; CharacterPosition < Increment; CharacterPosition++)
{
StringAppendage.Append("0");


}


// Repeatedly append string appendage until an out of memory exception is thrown.


try
{
if (Increment > 0)
while (Length < int.MaxValue)
{
Length += Increment;


s += StringAppendage.ToString(); // Append string appendage the length of the value of Increment


Console.WriteLine("s.Length = " + s.Length + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm"));


}


}
catch (OutOfMemoryException ex) // Note: Any other exception will crash the program.
{
Console.WriteLine("\n" + ex.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");


Length -= Increment;


Increment /= 10;


Console.WriteLine("After decimation, the value of Increment is " + Increment + ".");


}
catch (Exception ex2)
{
Console.WriteLine("\n" + ex2.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");


Console.WriteLine("Press a key to continue...");


Console.ReadKey();


}


if (Increment > 0)
{
goto LoopPoint;


}


Console.WriteLine("Test complete.");


Console.WriteLine("\nThe max length of a string is " + s.Length + ".");


Console.WriteLine("\nPress any key to continue.");


Console.ReadKey();


}

我的研究结果如下:

绳子测试,尼古拉斯·约翰·约瑟夫·泰勒

理论上,c#应该支持int类型的字符串。MaxValue,但是我们运行

这是一个快速测试,缩小结果以找到最大值

.字符串长度

测试开始了…现在:

s.Length = 1000000000 at 08/05/2019 12:06

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量的值为 100000000 . < / p >

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量的值为 10000000. s. length = 1010000000 at 08/05/2019 12:06 s。Length = 1020000000 at 08/05/2019 12:06 s。长度= 1030000000 at 08/05/2019 12:06年代。Length = 1040000000 at 08/05/2019 12:06 s。Length = 1050000000 08/05/2019 12:06 s。Length = 1060000000 at 08/05/2019 12:06 s。长度 = 1070000000 at 08/05/2019 12:06

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量的值为1000000。 s. length = 1071000000 at 08/05/2019 12:06 s。长度= 1072000000 at 08/05/2019 12:06 s。Length = 1073000000 at 08/05/2019 12:06

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量值为100000。 s. length = 1073100000 at 08/05/2019 12:06 s。长度= 1073200000 at 08/05/2019 12:06 s。Length = 1073300000 at 08/05/2019 12:06 s。长度= 1073400000在08/05/2019 12:06秒。长度= 1073500000在08/05/2019 12:06年代。Length = 1073600000 at 08/05/2019 12:06 s。长度= 1073700000 在08/05/2019 12:06

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量值为10000。 s. length = 1073710000 at 08/05/2019 12:06 s。长度= 1073720000 at 08/05/2019 12:06 s。Length = 1073730000 at 08/05/2019 12:06 s。长度= 1073740000 at 08/05/2019 12:06

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量值为1000。 s.Length = 1073741000 at 08/05/2019 12:06

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:06。抽取后,增量的值为100。 s. length = 1073741100 at 08/05/2019 12:06 s。长度= 1073741200 at 08/05/2019 12:06 s。Length = 1073741300 at 08/05/2019 12:07 s。长度= 1073741400 at 08/05/2019 12:07 s。Length = 1073741500 at 08/05/2019 12:07年代。Length = 1073741600 at 08/05/2019 12:07 s。长度= 1073741700 在08/05/2019 12:07

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:07。抽取后,增量值为10。 s. length = 1073741710 at 08/05/2019 12:07 s。长度= 1073741720 at 08/05/2019 12:07 s。Length = 1073741730 at 08/05/2019 12:07 s。长度= 1073741740 at 08/05/2019 12:07 s。长度= 1073741750 at 08/05/2019 12:07年代。Length = 1073741760 at 08/05/2019 12:07 s。长度= 1073741770 08/05/2019 12:07 s。Length = 1073741780 at 08/05/2019 12:07 s。长度 = 1073741790 at 08/05/2019 12:07

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:07。抽取后,增量值为1。 s.Length = 1073741791 at 08/05/2019 12:07

System类型的异常。抛出OutOfMemoryException'。在 08/05/2019 12:07。抽取后,增量的值为0。测试 完成。< / p >

字符串的最大长度为1073741791。

按任意键继续。

我的机器上字符串的最大长度是1073741791。

如果大家能在下面留言,我会非常感激的。

如果人们得到相同或不同的结果,这将是很有趣的。

String在RAM的堆中分配动态内存大小。但是字符串地址存储在堆栈中,占用4个字节的内存。