Existe uma diferença de desempenho perceptível entre o uso de interpolação de string:
myString += $"{x:x2}";
vs String.Format ()?
myString += String.Format("{0:x2}", x);
Só estou perguntando porque o Resharper está solicitando a correção, e eu já fui enganado antes.
Respostas:
Notável é relativo. No entanto: a interpolação de strings é transformada em
string.Format()
tempo de compilação, então elas devem terminar com o mesmo resultado.No entanto, existem diferenças sutis: como podemos dizer a partir dessa pergunta, a concatenação de string no especificador de formato resulta em uma
string.Concat()
chamada adicional .fonte
int
é usado).var a = "hello"; var b = $"{a} world";
compila para concatenação de string.var a = "hello"; var b = $"{a} world {1}";
compila para o formato de string.a interpolação de string é transformada em string.Format () em tempo de compilação.
Também em string.Format, você pode especificar várias saídas para um único argumento e diferentes formatos de saída para um único argumento. Mas a interpolação de strings é mais legível, eu acho. Então a escolha é sua.
Existem alguns resultados de teste de desempenho https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
fonte
String::Format
. e às vezes emString::Concat
. E o teste de desempenho nessa página não é realmente significativo: a quantidade de argumentos que você passa para cada um desses métodos é dependente. concat nem sempre é o mais rápido, stringbuilder nem sempre é o mais lento.A questão era sobre o desempenho, no entanto, o título diz apenas "vs", então eu sinto que tenho que adicionar mais alguns pontos, embora alguns deles sejam opinativos.
Localização
string.Format
. No entanto, existem ferramentas para isso (por exemploReSharper
).Capacidade de manutenção (minha opinião)
string.Format
é muito mais legível, pois se concentra na frase que eu gostaria de formular, por exemplo, ao construir uma mensagem de erro agradável e significativa. Usar os{N}
marcadores de posição me dá mais flexibilidade e é mais fácil modificá-lo posteriormente.string.Format
é muito menos sujeito a isso.Portanto, com base nisso, decidi manter a
string.Format
maior parte do meu código. No entanto, preparei um método de extensão para ter uma forma de codificação mais fluente da qual gosto muito mais. A implementação da extensão é de uma linha e parece simplesmente assim em uso.A interpolação é um ótimo recurso, não me interpretem mal. Mas, IMO, ele brilha melhor nas linguagens que não
string.Format
possuem o recurso semelhante, por exemplo, JavaScript.fonte
{3}
é X ou Y, especialmente se você começar a reorganizar seu formato. Exemplo de Madlibs:$"It was a {adjective} day in {month} when I {didSomething}"
vsstring.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
->$"I {didSomething} on a {adjective} {month} day"
vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
eu acho que você está muito menos sujeito a esse problema. Mas enfim, é por isso que enfatizei que é minha opinião :)