什麼是可以在.NET中創建的最長的字符串?就我所知,String
類的文檔沒有提到這個問題,因此權威答案可能需要一些內部知識。在64位系統上的最大變化是什麼?.NET字符串的最大可能長度是多少?
[這要求更多的好奇心比實際使用 - !我不打算創建一個使用巨大字符串的任何代碼]
什麼是可以在.NET中創建的最長的字符串?就我所知,String
類的文檔沒有提到這個問題,因此權威答案可能需要一些內部知識。在64位系統上的最大變化是什麼?.NET字符串的最大可能長度是多少?
[這要求更多的好奇心比實際使用 - !我不打算創建一個使用巨大字符串的任何代碼]
理論極限可能是2,147,483,647,但實際極限遠不及此。由於.Net程序中沒有單個對象可能超過2GB,並且字符串類型使用unicode(每個字符2字節),所以您可以做的最好的是1,073,741,823,但是您不可能分配到32位機器。
這是那些"If you have to ask, you're probably doing something wrong."
由於System.String的長度屬性是一個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
}
在這裏應用二進制搜索可能會幫助您更快地找到答案... – Mario 2010-07-12 21:08:58
使用測試驅動的答案。 – 2011-01-04 00:46:03
200兆......此時你的應用研到虛擬停頓情形之一的,大約有演出工作集內存和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類是常一個簡單的替換。 如果您的數據來自文件,請考慮stream-based classes之一。
s = s +「stuff」的問題在於它必須分配一個全新的區域來保存數據,然後將所有舊數據複製到它並加上新的東西 - 每個和每個循環ITERATION。因此,用s = s +「stuff」加上5個字節到100萬是極其昂貴的。 如果你想要的只是寫5個字節到最後並繼續你的程序,那麼你必須選擇一個課程,留下一些增長空間。
StringBuilder sb = new StringBuilder(5000);
for (; ;)
{
sb.Append("stuff");
}
StringBuilder將auto-grow by doubling當它的限制被擊中。所以你會在開始時看到一次增長的痛苦,一次是5000字節,再次是10000,再次是20000.附加字符串會在每次循環迭代時產生痛苦。
字符串不是由整數限定,通常認爲
存儲器限制之外,字符串不能有多於2 (1,073,741,824)字符,因爲一個2GB的限制是由微軟的CLR(通用語言強加運行)。
希望這可能在未來發生變化。
請注意,BinaryWriter.Write(字符串)將字符串長度寫爲無符號字符(一個字節)!
+1好扣除 – 2011-03-11 11:10:51
@ m.edmondson:實際上我並不確信。一個[array](https://msdn.microsoft.com/en-us/library/system.array%28v=vs.110%29.aspx)實例也有一個LongLength,一個流使用`long `作爲長度。雖然它是有效的答案,但它沒有一個準確的方法來衡量這一點。 – 2015-01-27 19:59:05
但是前兩位用於ASCII /非ASCII指示,因爲[這篇文章](https://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED)說,所以它應該是2^30 = 1 073 741 824 – Saito 2017-02-10 12:04:53