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

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


当前回答

因为字符串。Length是一个整数(这是Int32的别名),其大小限制为Int32。MaxValue unicode字符。: -)

其他回答

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

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

StringBuilder类通常是一个简单的替代。 如果您的数据来自一个文件,请特别考虑一个基于流的类。

s += "stuff"的问题是,它必须分配一个全新的区域来保存数据,然后将所有旧数据复制到它加上新数据-每一次循环迭代。因此,用s += "stuff"在1,000,000中增加5个字节的开销非常大。 如果你想只写5个字节到最后,然后继续你的程序,你必须选择一个留出一些增长空间的类:

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

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

因为字符串。Length是一个整数(这是Int32的别名),其大小限制为Int32。MaxValue unicode字符。: -)

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

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