2008-09-26 120 views
186

什麼是可以在.NET中創建的最長的字符串?就我所知,String類的文檔沒有提到這個問題,因此權威答案可能需要一些內部知識。在64位系統上的最大變化是什麼?.NET字符串的最大可能長度是多少?

[這要求更多的好奇心比實際使用 - !我不打算創建一個使用巨大字符串的任何代碼]

回答

270

理論極限可能是2,147,483,647,但實際極限遠不及此。由於.Net程序中沒有單個對象可能超過2GB,並且字符串類型使用unicode(每個字符2字節),所以您可以做的最好的是1,073,741,823,但是您不可能分配到32位機器。

這是那些"If you have to ask, you're probably doing something wrong."

47

由於System.String的長度屬性是一個Int32,我猜想那最大長度將是2,147,483,647個字符(最大Int32大小)。如果它允許更長時間,你將無法檢查長度,因爲這會失敗。

+10

+1好扣除 – 2011-03-11 11:10:51

+2

@ 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

+0

但是前兩位用於ASCII /非ASCII指示,因爲[這篇文章](https://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED)說,所以它應該是2^30 = 1 073 741 824 – Saito 2017-02-10 12:04:53

0

由於string.length減爲整數(這是一個的Int32別名)它的大小被限制爲Int32.MaxValue Unicode字符;)

60

基於我的高度科學準確實驗中,頂出我的機器上遠遠早於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 
} 
+25

在這裏應用二進制搜索可能會幫助您更快地找到答案... – Mario 2010-07-12 21:08:58

+24

使用測試驅動的答案。 – 2011-01-04 00:46:03

1

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 
20

對於任何人來到這個話題晚了,我看得出來,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.附加字符串會在每次循環迭代時產生痛苦。

5

字符串不是由整數限定,通常認爲

存儲器限制之外,字符串不能有多於2 (1,073,741,824)字符,因爲一個2GB的限制是由微軟的CLR(通用語言強加運行)。

希望這可能在未來發生變化。

0

請注意,BinaryWriter.Write(字符串)將字符串長度寫爲無符號字符(一個字節)!

相關問題