¿Cuál es la cadena más larga que se puede crear en .NET? Los documentos de la String
clase no dicen nada sobre esta pregunta, por lo que puedo ver, por lo que una respuesta autorizada puede requerir algunos conocimientos de aspectos internos. ¿Cambiaría el 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!]
byte[]
.Basado en mi experimento altamente científico y preciso, supera 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 identificación).
ACTUALIZACIÓN: Después de unas horas, me he rendido. Resultados finales: puede ser mucho más grande que 100,000,000 caracteres, dado instantáneamente
System.OutOfMemoryException
en 1,000,000,000 caracteres.fuente
Como la
Length
propiedad deSystem.String
es unInt32
, supongo que la longitud máxima sería 2.147.483.647 caracteres (Int32
tamaño máximo ). Si permitiera más tiempo, no podría verificar la longitud ya que eso fallaría.fuente
LongLength
y una secuencia utilizalong
como longitud. Aunque es una respuesta válida, no es una forma precisa de medir esto.Para cualquiera que llegue tarde a este tema, podría ver que "probablemente no deberías hacer eso" de hitscan podría hacer que alguien pregunte qué debería 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
s += "stuff"
es que tiene que asignar un área completamente nueva para contener los datos y luego copiar todos los datos antiguos más los nuevos: CADA ITERACIÓN DE LAZO. Por lo tanto, agregar cinco bytes a 1,000,000s += "stuff"
es extremadamente costoso. Si lo que desea es escribir cinco bytes hasta el final y continuar con su programa, debe elegir una clase que deje espacio para crecer:StringBuilder
se auto-crecimiento, duplicando cuando de límite es exitosa. Entonces, verá el dolor de crecimiento una vez al inicio, una vez a 5,000 bytes, nuevamente a 10,000, nuevamente a 20,000. Las cadenas anexas generarán el dolor en cada iteración del bucle.fuente
La longitud máxima de una cadena en mi máquina es 1,073,741,791 .
Verá, las cadenas no están limitadas por un número entero como se cree comúnmente.
Dejando a un lado las restricciones de memoria, las cadenas no pueden 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. 33 más de lo que me permitió mi computadora.
Ahora, aquí hay algo que puedes probar tú mismo.
Cree una nueva aplicación de consola C # en Visual Studio y luego copie / pegue el método principal aquí:
Mis resultados fueron los siguientes:
La longitud máxima de una cadena en mi máquina es 1073741791.
Apreciaría mucho si las personas pudieran publicar sus resultados como un comentario a continuación.
Será interesante saber si las personas obtienen los mismos o diferentes resultados.
fuente
200 megas ... en ese momento, su aplicación se detiene virtualmente, tiene una memoria de conjunto de trabajo y la o / s comienza a actuar como si tuviera que reiniciar.
fuente
Como
String.Length
es un entero (es un alias paraInt32
), su tamaño está limitado aInt32.MaxValue
caracteres unicode. ;-)fuente