Какова максимально возможная длина a.NET струна?


Какова самая длинная строка, которая может быть создана в .NET? документы для String класс молчит по этому вопросу, насколько я могу видеть, поэтому авторитетный ответ может потребовать некоторого знания внутренних органов. Будет ли Максимальное изменение в 64-разрядной системе?

[это больше для любопытства, чем для практического использования - я не собираюсь создавать код, который использует гигантские строки!]

7 202

7 ответов:

основанный на моем сильно научном и точном эксперименте, оно покрывает вне на моей машине задолго до 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
}

С Length собственность System.String это Int32, Я бы предположил, что максимальная длина будет 2,147,483,647 символов (max Int32 размер). Если бы это позволяло дольше, вы не могли бы проверить длину, так как это не удалось бы.

для тех, кто приходит к этой теме поздно, я мог видеть, что hitscan "вы, вероятно, не должны этого делать" может заставить кого-то спросить, что они должны делать...

The StringBuilder класс часто легкая замена. Рассмотрим один из потоковые классы особенно, если ваши данные поступают из файла.

проблема с s += "stuff" это то, что он должен выделить совершенно новую область для хранения данных, а затем скопировать все старые данные в нее плюс новый материал-каждая итерация цикла. Итак, добавление пяти байтов к 1,000,000 с s += "stuff" это очень дорого. Если вы хотите просто написать пять байтов до конца и продолжить свою программу, вы должны выбрать класс, который оставляет некоторое пространство для роста:

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

StringBuilder будет автоматический рост за счет удвоения когда лимит превышен. Таким образом, вы увидите боль роста один раз при запуске, один раз на 5 000 байт, снова на 10 000, Снова на 20 000. Добавление строк будет понести боль каждую итерацию цикла.

строки не ограничены целым числом, как принято считать.

ограничения памяти в сторону, строки не могут иметь более 230 (1,073,741,824) символов, так как ограничение 2 ГБ накладывается Microsoft CLR (Common Language Runtime).

надеюсь, это может измениться в будущем.

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

С String.Length - Это целое число (то есть псевдоним для Int32), его размер ограничен до Int32.MaxValue символы юникода. ; -)