当前位置:  开发笔记 > 程序员 > 正文

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

如何解决《.NET字符串的最大可能长度是多少?》经验,为你挑选了5个好方法。

什么是可以在.NET中创建的最长字符串?String就我所见,该课程的文档对此问题保持沉默,因此权威性答案可能需要一些内部知识.64位系统的最大变化是什么?

[这更多是为了好奇而不是实际使用 - 我不打算创建任何使用巨大字符串的代码!]



1> HitScan..:

理论极限可能是2,147,483,647,但实际限制远不及那个.由于.Net程序中没有单个对象可能超过2GB且字符串类型使用unicode(每个字符2个字节),所以你能做的最好是1,073,741,823,但是你不可能在32位机器.

这是"如果你不得不问,你可能做错了什么"的情况之一.


如果有人对确切的值感兴趣,在我的64位机器上它是1,073,741,791(1024·1024·1024 - 33)个字符.另请参阅[关于`byte []`的确切最大大小的相关问题](http://stackoverflow.com/q/6616739/41071).
这是正确的答案.在能够分配足以耗尽字符串长度之前,您更有可能耗尽内存.在新的启动时,您可能能够提取2GB(包含1M个字符)的分配,如此处所述,但这就是全部.
假设您的"没有单个对象可能超过2Gb"断言是准确的,这是理论上的限制以及实际的限制 - 对字符串长度的约束将是总对象大小,而不是长度字段的容量.
我对那些包含简短但深入解释的答案感到疯狂.
在64位计算机上有一个允许.NET 4.5(及更高版本)对象大于2GB的选项.[点击此处](http://stackoverflow.com/questions/1087982/single-objects-still-limited-to-2-gb-in-size-in-clr-4-0)

2> bdukes..:

基于我高度科学和准确的实验,它在我的机器上达到了1,000,000,000个字符之前.(我仍在运行下面的代码以获得更好的精确定位).

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


在这里应用二进制搜索可能会帮助您更快地找到这个答案...

3> Ryan Farley..:

由于Length属性System.String为a Int32,我猜测最大长度为2,147,483,647个字符(最大Int32大小).如果允许的时间更长,则无法检查长度,因为这会失败.


@ m.edmondson:我实在不相信.实例的[array](https://msdn.microsoft.com/en-us/library/system.array%28v=vs.110%29.aspx)也有一个`LongLength`,一个流使用`long `长度.虽然它是有效的答案,但它是衡量这一点的准确方法.

4> user922020..:

对于那些迟到这个话题的人来说,我可以看到hitscan的"你可能不应该这样做"可能会让别人问他们应该怎么做......

该StringBuilder的类往往是一个易于更换.如果您的数据来自文件,请考虑其中一个基于流的类.

问题s += "stuff"在于它必须分配一个全新的区域来保存数据,然后将所有旧数据复制到它以及新的东西 - 每个循环和每次循环迭代.因此,增加五个字节到1,000,000 s += "stuff"是非常昂贵的.如果你想要的只是写五个字节到最后并继续你的程序,你必须选择一个留下一些增长空间的类:

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

StringBuilder当它受到限制时,它会自动增长一倍.因此,您将在开始时看到增长痛苦,一次是5,000字节,再次是10,000,再次是20,000.追加字符串会在每次循环迭代时产生痛苦.


值得注意的是StringBuilder允许您设置初始大小.如果你知道你将提前使用10,000,000个条目,那么你可以忽略一些危机.
+1用于查看问题并回答好的设计.相比之下,"这就是你的字符串在吹响之前有多大",相反,"如果你真的需要存储大量文本,请使用它......"

5> Knickerless-..:

字符串不受通常认为的整数限制.

除了内存限制,字符串不能超过2 30(1,073,741,824)个字符,因为Microsoft CLR(公共语言运行时)强加了2GB的限制.

希望这可能在未来发生变化.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有