.net - set max length c#




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

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

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!]


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