Quelle est la longueur maximale possible d’une chaîne .NET?

Quelle est la chaîne la plus longue pouvant être créée dans .NET? Les documents de la classe Ssortingng sont muets sur cette question, pour autant que je sache, une réponse faisant autorité pourrait donc nécessiter une certaine connaissance des éléments internes. Le maximum changerait-il sur un système 64 bits?

[Cela est demandé plus pour la curiosité que pour l’utilisation pratique – je n’ai pas l’intention de créer un code qui utilise des chaînes gigantesques!]

    La limite théorique peut être de 2 147 483 647, mais la limite pratique est loin d’être la même. Comme aucun object dans un programme .NET ne peut dépasser 2 Go et que le type de chaîne utilise unicode (deux octets pour chaque caractère), le mieux que vous puissiez faire est 1 073 741 823, mais vous ne pourrez probablement pas l’allouer sur une machine 32 bits.

    C’est l’une de ces situations où [” Si vous devez demander, vous faites probablement quelque chose de mal ” . ] C’est le cas.

    Sur la base de mon expérience hautement scientifique et précise, il dépasse bien ma machine avant 1 000 000 de caractères. (J’exécute toujours le code ci-dessous pour obtenir un meilleur repère).

    MISE À JOUR: Après quelques heures, j’ai abandonné. Résultats finaux: Peut aller beaucoup plus grand que 100 000 000 de caractères, donnant instantanément System.OutOfMemoryException à 1 000 000 000 de caractères.

     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 } 

    Puisque la propriété Length de System.Ssortingng est une Int32 , je suppose que la longueur maximale serait de 2 147 483 647 caractères (taille maximale Int32 ). Si vous accordiez plus de temps, vous ne pouviez pas vérifier la longueur car cela échouerait.

    Pour ceux qui abordent ce sujet en retard, je pourrais voir que les hitscan “vous ne devriez probablement pas faire ça” pourraient amener quelqu’un à demander ce qu’ils devraient faire…

    La classe SsortingngBuilder est souvent un remplacement facile. Considérez en particulier l’une des classes basées sur les stream , si vos données proviennent d’un fichier.

    Le problème avec 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 LOTION ITERATION. Ainsi, append cinq octets à 1 000 000 avec s += "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 place à la croissance:

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

    SsortingngBuilder se développera automatiquement en doublant lorsque sa limite est atteinte. Donc, vous verrez la douleur de croissance une fois au début, une fois à 5 000 octets, encore une fois à 10 000, encore une fois à 20 000 octets. L’ajout de chaînes entraînera la douleur à chaque itération de boucle.

    Les chaînes ne sont pas limitées par des nombres entiers comme on le croit généralement.

    Mis à part les ressortingctions de mémoire, les chaînes ne peuvent pas contenir plus de 2 30 (1 073 741 824) caractères, car une limite de 2 Go est imposée par Microsoft CLR (Common Language Runtime).

    Espérons que cela pourrait changer dans le futur.

    200 Mo … à quel point votre application s’arrête virtuellement, a à peu près une mémoire de travail en concert, et le système d’exploitation commence à agir comme si vous deviez redémarrer.

     static void Main(ssortingng[] args) { ssortingng s = "hello world"; for(;;) { s = s + s.Subssortingng(0, s.Length/10); Console.WriteLine(s.Length); } } 12 13 14 15 16 17 18 ... 158905664 174796230 192275853 211503438 

    Ssortingng.Length étant un entier (alias Int32 ), sa taille est limitée aux Int32.MaxValue Unicode Int32.MaxValue . 😉