.net - set max length c#




Qual é o tamanho máximo possível de uma string.NET? (5)

Qual é a string mais longa que pode ser criada no .NET? Os documentos para a classe String são silenciosos nesta questão, tanto quanto eu posso ver, portanto, uma resposta autoritativa pode exigir algum conhecimento de internos. A mudança máxima em um sistema de 64 bits?

[Isso é solicitado mais por curiosidade do que por uso prático - não pretendo criar nenhum código que use strings gigantescas!]


200 megas ... ponto em que seu aplicativo trava para uma parada virtual, tem cerca de uma memória de conjunto de trabalho de show e o / s começa a agir como se fosse necessário reinicializar.

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

As cordas não são limitadas por inteiro como é comumente acreditado.

Restrições de memória à parte, Strings não podem ter mais de 2 30 (1.073.741.824) caracteres, já que um limite de 2 GB é imposto pelo Microsoft CLR (Common Language Runtime).

Espero que isso possa mudar no futuro.


Como String.Length é um inteiro (que é um alias para Int32 ), seu tamanho é limitado a caracteres unicode Int32.MaxValue . ;-)


Como a propriedade Length de System.String é um Int32 , eu diria que o tamanho máximo seria 2.147.483.647 caracteres (tamanho máximo de Int32 ). Se permitisse mais tempo, você não poderia verificar o tamanho, pois isso falharia.


Se alguém chegar a este tópico mais tarde, eu posso ver que o "você provavelmente não deveria fazer isso" de hitscan pode fazer com que alguém pergunte o que deve fazer…

A classe StringBuilder é geralmente uma substituição fácil. Considere uma das classes baseadas em fluxo , especialmente, se seus dados forem provenientes de um arquivo.

O problema com s += "stuff" é que ele tem que alocar uma área completamente nova para armazenar os dados e, em seguida, copiar todos os dados antigos para ele, além das novas coisas - EACH E EVERY LOOP ITERATION. Então, adicionar cinco bytes a 1.000.000 com s += "stuff" é extremamente caro. Se o que você quer é escrever apenas cinco bytes no final e continuar com seu programa, você tem que escolher uma classe que deixe espaço para crescimento:

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

StringBuilder aumentará automaticamente dobrando quando o limite for atingido. Assim, você verá a dor do crescimento uma vez no início, uma vez em 5.000 bytes, novamente em 10.000, novamente em 20.000. Anexar strings causará dor a cada iteração de loop.





limits