¿Cuál es la longitud máxima posible de una cadena .NET?

¿Cuál es la cadena más larga que se puede crear en .NET? Los documentos para la clase String son silenciosos en cuanto a esta pregunta, por lo que puedo ver, por lo que una respuesta autorizada podría requerir algún conocimiento de los aspectos internos. ¿El cambio máximo en un sistema de 64 bits?

[Esto se pide más por curiosidad que por uso práctico: ¡no tengo la intención de crear ningún código que use cadenas gigantescas!]

El límite teórico puede ser 2.147.483.647, pero el límite práctico no está cerca de eso. Como ningún objeto en un progtwig .NET puede tener más de 2 GB y el tipo de cadena utiliza unicode (dos bytes para cada carácter), lo mejor que puede hacer es 1.073.741.823, pero es probable que nunca pueda asignarlo una máquina de 32 bits.

Esta es una de esas situaciones en las que [” Si tiene que preguntar, probablemente esté haciendo algo mal “] es el caso.

De acuerdo con mi experimento altamente científico y exacto, encabeza mi máquina mucho antes de 1,000,000,000 de caracteres. (Todavía estoy ejecutando el código a continuación para obtener una mejor ubicación).

ACTUALIZACIÓN: después de unas horas, me di por vencido. Resultados finales: puede llegar a ser mucho más grande que 100,000,000 caracteres, al instante se le otorga System.OutOfMemoryException a 1,000,000,000 de caracteres.

 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 } 

Como la propiedad Length de System.String es un Int32 , supongo que la longitud máxima sería de 2.147.483.647 caracteres (tamaño máximo de Int32 ). Si permitía más tiempo, no podía verificar la Longitud, ya que eso no funcionaría.

Para cualquiera que llegue a este tema tarde, podría ver que el “probablemente no deberías hacer eso” de hitscan podría hacer que alguien pregunte qué deberían hacer …

La clase StringBuilder es a menudo un reemplazo fácil. Considere especialmente una de las clases basadas en secuencias , si sus datos provienen de un archivo.

El problema con s += "stuff" es que tiene que asignar un área completamente nueva para contener los datos y luego copiar todos los datos antiguos más las cosas nuevas: CADA Y TODAS LAS IMÁGENES DE BUCLE. Entonces, agregar cinco bytes a 1,000,000 con s += "stuff" es extremadamente costoso. Si lo que quieres es escribir cinco bytes hasta el final y continuar con tu progtwig, debes elegir una clase que deje espacio para crecer:

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

StringBuilder crecerá automáticamente al duplicar cuando se alcanza el límite. Por lo tanto, verá el dolor de crecimiento una vez al inicio, una vez en 5.000 bytes, nuevamente en 10.000, nuevamente en 20.000. Al agregar cadenas se incurrirá en el dolor de cada iteración de bucle.

Las cadenas no están limitadas por enteros, como comúnmente se cree.

Dejando a un lado las restricciones de memoria, Strings no puede tener más de 2 30 (1,073,741,824) caracteres, ya que Microsoft CLR (Common Language Runtime) impone un límite de 2 GB.

Con suerte, esto puede cambiar en el futuro.

200 megas … en ese punto tu aplicación se detiene de manera virtual, tiene una memoria de trabajo funcionando y el o / s comienza a actuar como si tuvieras que reiniciar.

 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 

Dado que String.Length es un número entero (que es un alias para Int32 ), su tamaño está limitado a caracteres Unicode Int32.MaxValue . 😉