Uma história sobre boxing/unboxing e interpolação de strings em C#
Este artigo deve esclarecer o que a interpolação de strings tem a ver com boxing e unboxing. Além disso, quero desmistificar o aspecto do desempenho.
Interpolação de String
Imagine o seguinte trecho:
int meuNumero = 2;
var minhaString = $"Meu número é {meuNumero}";
A interpolação de strings permite que você crie uma string "inline". A principal vantagem é que é super legível.
O recurso em si é apenas um açúcar sintático. Isso significa que uma etapa na cadeia do compilador reduzirá esse termo para algo compreensível. E a maioria de vocês pensa "Sim, claro. Ele será reduzido para string.Format", mas nem sempre é esse o caso.
E aqui o boxing e o unboxing entram em cena. Boxing significa converter um valor para o objeto de tipo. O unboxing é o contrário.
O compilador fará coisas diferentes dependendo se o boxing está ou não envolvido.
Vamos dar uma olhada nisso:
string World = "Mundo";
int AgeInBillionYears = 4;
Console.WriteLine($"Olá {World}. Você tem {AgeInBillionYears} anos de idade");
Este termo se tornará como suspeito:
Console.WriteLine(string.Format("Olá {0}. Você tem {1} anos de idade", World, AgeInBillionYears));
Vamos dar uma olhada no exemplo dois:
Console.WriteLine($"Olá {World}. Você tem {AgeInBillionYears.ToString()} anos de idade");
Este termo se tornará
string[] array = new string[5];
array[0] = "Olá ";
array[1] = World;
array[2] = ". Você tem ";
array[3] = AgeInBillionYears.ToString();
array[4] = " anos de idade";
Console.WriteLine(string.Concat(array));
Podemos ver que o compilador usa string.Concat. Por quê? Pois é bem fácil. Em nosso primeiro exemplo temos um inteiro e em nosso segundo exemplo temos uma string e se você observar as duas definições de método deve ficar claro o que acontece.
string.Format(string, object) e string.Concat(string[])
Vemos que a Concat não usará nenhum boxing. Como o compilador sabe agora que tudo é do tipo string, ele pode usar a versão mais rápida.
Em todos momentos que boxing / unboxing estão envolvidos na interpolação de strings, o compilador irá utilizar string.Format.
Benchmark Na Prática!
Nós temos vários cenários: string.Format, string.Concat e um construtor de strings. Vamos sempre concatená-los. Mas uma vez com e uma vez sem boxing/unboxing. Além disso, verificaremos apenas 2 strings, 10 strings, 50 strings e 100 strings.
O que podemos ver é que StringBuilder não faz sentido para uma pequena quantidade de strings. Por favor, mantenha em mente que estamos falando de nanossegundos. Mas podemos ver que boxing e unboxing podem desempenhar um papel importante no desempenho da concatenação de strings.
Se você quiser testar e ver isto acontecer, acesse este link do Sharplab.io:
O código fonte para você testar pode ser obtido no link do GitHub Gist abaixo:
Código Fonte Interpolação Strings