Quelle est la plus longue chaîne pouvant être créée dans .NET? Les documents de la String
classe sont muets sur cette question pour autant que je puisse voir, donc une réponse faisant autorité pourrait nécessiter une certaine connaissance des internes. Le changement maximum sur un système 64 bits?
[Ceci est demandé plus par curiosité que pour une utilisation pratique - je n'ai pas l'intention de créer un code qui utilise des chaînes gigantesques!]
byte[]
.Sur la base de mon expérience hautement scientifique et précise, il dépasse ma machine bien avant 1 000 000 000 de caractères. (J'exécute toujours le code ci-dessous pour obtenir un meilleur repérage).
MISE À JOUR: Après quelques heures, j'ai abandonné. Résultats finaux: peut aller bien au-delà de 100 000 000 caractères, instantanément donné
System.OutOfMemoryException
à 1 000 000 000 caractères.la source
Étant donné que la
Length
propriété deSystem.String
est unInt32
, je suppose que la longueur maximale serait de 2 147 483 647 caractères (Int32
taille maximale ). Si cela permettait plus longtemps, vous ne pourriez pas vérifier la longueur car cela échouerait.la source
LongLength
aussi un et un flux utiliselong
comme longueur. Bien que ce soit une réponse valide, c'est une bonne façon de mesurer cela.Pour tous ceux qui viennent sur ce sujet en retard, je pouvais voir que hitscan «vous ne devriez probablement pas faire ça» pourrait amener quelqu'un à demander ce qu'il doit faire…
La classe StringBuilder est souvent un remplacement facile. Considérez en particulier l'une des classes basées sur les flux , si vos données proviennent d'un fichier.
Le problème
s += "stuff"
est qu'il doit allouer une zone complètement nouvelle pour contenir les données, puis y copier toutes les anciennes données ainsi que les nouveaux éléments - CHAQUE ET CHAQUE ITERATION DE BOUCLE. Ainsi, ajouter cinq octets à 1 000 000 avecs += "stuff"
est extrêmement coûteux. Si vous voulez simplement écrire cinq octets à la fin et poursuivre votre programme, vous devez choisir une classe qui laisse une certaine marge de croissance:StringBuilder
augmentera automatiquement en doublant lorsque sa limite sera atteinte. Ainsi, vous verrez la douleur de croissance une fois au début, une fois à 5 000 octets, à nouveau à 10 000, à nouveau à 20 000. L'ajout de cordes entraînera la douleur à chaque itération de la boucle.la source
La longueur maximale d'une chaîne sur ma machine est de 1 073 741 791 .
Vous voyez, les chaînes ne sont pas limitées par un entier, comme on le croit généralement.
Mis à part les restrictions de mémoire, les chaînes ne peuvent pas avoir plus de 2 30 (1 073 741 824 ) caractères, car une limite de 2 Go est imposée par le Microsoft CLR (Common Language Runtime). 33 de plus que mon ordinateur ne le permettait.
Maintenant, voici quelque chose que vous pouvez essayer vous-même.
Créez une nouvelle application console C # dans Visual Studio, puis copiez / collez la méthode principale ici:
Mes résultats étaient les suivants:
La longueur maximale d'une chaîne sur ma machine est 1073741791.
J'apprécierais beaucoup que les gens puissent poster leurs résultats sous forme de commentaire ci-dessous.
Il sera intéressant de savoir si les gens obtiennent des résultats identiques ou différents.
la source
200 mégaoctets ... à ce moment-là, votre application s'arrête virtuellement, a environ une mémoire de jeu de travail et les o / s commencent à agir comme si vous deviez redémarrer.
la source
Étant donné qu'il
String.Length
s'agit d'un entier (c'est-à-dire d'un alias pourInt32
), sa taille est limitée auxInt32.MaxValue
caractères unicode. ;-)la source