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

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

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

Теоретический предел может составлять 2,147,483,647, но практический предел нигде не близок. Поскольку ни один объект в .NET-программе не может превышать 2 ГБ, а тип строки использует unicode (два байта для каждого символа), лучшее, что вы могли бы сделать, это 1 073 741 823, но вы вряд ли сможете выделить это на 32-битная машина.

Это одна из тех ситуаций, когда [« Если вам нужно спросить, вы, вероятно, что-то не так». ].

Основываясь на моем очень научном и точном эксперименте, он заканчивается на моей машине задолго до 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 символов (максимальный размер Int32 ). Если это разрешено дольше, вы не можете проверить длину, так как это не удастся.

Для тех, кто придет на эту тему поздно, я мог видеть, что hitscan «вы, вероятно, не должны этого делать», может заставить кого-то спросить, что они должны делать …

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

Проблема с s += "stuff" заключается в том, что она должна выделять совершенно новую область для хранения данных, а затем копировать все старые данные в нее плюс новый материал – КАЖДЫЙ И КАЖДОЙ ОБРАБОТКИ LOOP. Таким образом, добавление пяти байтов в 1 000 000 с помощью s += "stuff" чрезвычайно дорого. Если вы хотите просто написать пять байт до конца и продолжить свою программу, вам нужно выбрать class, который оставляет место для роста:

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

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

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

Ограничения памяти в стороне, строки не могут иметь более 2 30 (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 Unicode Int32.MaxValue . 😉

  • Java string intern и literal
  • Строка к двоичной в C #
  • PostgreSQL: разница между текстом и varchar (характер меняется)
  • Android: Как получить строку из ресурсов, используя ее имя?
  • Interesting Posts

    Спящий режим и без ПК

    Как читать хорошо сформированный XML в Java, но пропустить схему?

    Как остановить задачу, запланированную в classе Java.util.Timer

    Сравнение дат данных

    Как использовать reflection для вызова частного метода?

    Выбор между HttpClient и WebClient

    Если я куплю компьютер с Windows 8 и Secure Boot, смогу ли я все-таки установить Linux?

    Ошибка ContextSwitchDeadlock была обнаружена в C #

    В Excel VBA, как проверить, полностью ли загружена веб-страница?

    R: как объединить два огромных кадра данных без исчерпания памяти

    RunAs / savecred запрашивает пароль, если другой пользователь запускает тот же пакетный файл

    Как загрузиться с SSD, но есть установки и домашняя папка на HDD

    Создание делегатов вручную с использованием делегатов Action / Func

    Как запретить пользователю вводить текст в textarea после достижения максимального предела персонажа

    Ошибка Apple Mach-O Linker при компиляции для устройства

    Давайте будем гением компьютера.