Quando usar StringBuilder? [duplicado]
-
22-08-2019 - |
Pergunta
Duplicate possíveis:
vs StringBuilder
Eu só revisitados alguns dos livros que eu usei para pegar VB.NET. Não tenho a certeza que eu tenho isso na minha cabeça, entender como / o que StringBuilder é.
O que é a orientação para o uso? É melhor usá-lo se você está concatenando 2 strings ou 50?
Ou quando o comprimento da corda total é maior do que 128 caracteres?
Ou você vai ver um benefício de desempenho sempre que você usá-lo para adicionar strings juntos?
No caso em que é melhor usar uma instância de StringBuilder para construir uma instrução SQL que string.format("Select * from x where y = {0}",1)
?
É sempre me pareceu que declarar outra variável e incluindo um espaço nome não é benéfico para pequenas concatenações de cadeia, mas eu não tenho certeza agora.
Desculpe, grande quantidade de documentação diz-lhe o que usar, não apenas o que é melhor.
Solução
Eu tenho um artigo neste tema. Em resumo (copiado a partir do fundo da página):
- Definitivamente usar StringBuilder quando você está concatenando em um loop não-trivial - especialmente se você não sabe com certeza (em tempo de compilação) quantas iterações você vai fazer através do laço. Por exemplo, a leitura de um arquivo de um personagem em um momento, a criação de uma corda como você vai usar o operador + = é potencialmente suicida desempenho.
- Definitivamente usar o operador de concatenação quando você pode (legível) especificar tudo que precisa ser concatenados em um comunicado. (Se você tem uma série de coisas para concatenar, considerar chamar String.Concat explicitamente -. Ou String.Join se você precisar de um delimitador)
- Não tenha medo de quebrar literais-se em vários pedaços concatenadas - o resultado será o mesmo. Você pode facilitar a leitura, quebrando um longo literal em várias linhas, por exemplo, sem prejuízo para o desempenho.
- Se você precisa os resultados intermediários da concatenação para algo diferente do que alimentar a próxima iteração de concatenação, StringBuilder não vai ajudá-lo. Por exemplo, se você construir um nome completo de um nome e um sobrenome, e depois adicionar uma terceira peça de informação (o apelido, talvez) para o final, você só vai beneficiar de usar StringBuilder se você não faz precisa a string (nome + sobrenome) para outros fins (como fazemos no exemplo que cria um objeto Person).
- Se você só tem alguns concatenations para fazer, e você realmente deseja fazê-las em declarações separadas, isso realmente não importa o caminho que você vá. Que maneira é mais eficiente dependerá do número de concatenações os tamanhos de corda envolvidos, e que ordem eles estão concatenadas. Se você realmente acredita que parte do código a ser um gargalo de desempenho, perfil ou referência as duas coisas.
Outras dicas
Aqui é a minha regra de ouro:
StringBuilder
é melhor utilizada quando o número exato de concatenations é desconhecido em tempo de compilação.
Coding Horror tem um bom artigo sobre esta questão, A tragédia triste de Micro-Otimização Teatro .
Pessoalmente eu uso StringBuilder quando eu tenho mais do que apenas uma ou duas cordas para concatenar. Eu não tenho certeza se há um acerto de desempenho real a ser adquirida, mas eu sempre ler e foi dito que fazendo uma concatenação regular com várias cadeias cria uma cópia extra da corda cada vez que você fazê-lo, ao usar StringBuilder mantém um copiar até que você chamar o método ToString()
final sobre ele.
Alguém descobriu experimentalmente que o número crítico é 6. Mais de 6 concatenations em uma fileira e você deve usar um StringBuilder. não me lembro onde eu encontrei este.
No entanto, nota que, se você acabou de escrever isso em uma linha:
"qwert" + "yuiop" + "asdf" + "gh" + "jkl;" + "zxcv" + "bnm" + ",."
Isso é convertido em uma chamada de função (não sei como escrevê-lo em VB.net)
String.Concat("qwert", "yuiop", "asdf", "gh", "jkl;", "zxcv", "bnm", ",.");
Então, se você está fazendo todos os encadeamentos em uma linha, em seguida, não se incomodam com StringBuilder porque String.Concat efetivamente vai fazer todos os encadeamentos de uma só vez. É somente se você estiver fazendo-los em um loop ou sucessivamente concatenando.
A minha regra -. Quando você está adicionando a uma corda em um loop For ou Foreach, usar o StringBuilder