Uma história sobre boxing/unboxing e interpolação de strings em C#

Imagem de capa 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

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.

Benchmark Na Prática

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