Um dia no Stack Overflow: A Maldição das Strings Longas em C#
Imagine a situação. Você está escrevendo em C# um JSON de configuração, uma consulta SQL ou, digamos, um template HTML diretamente no código. A string fica longa, feia e absolutamente ilegível. Você pressiona Enter para quebrar a linha... e recebe um erro de compilação. Familiar?
A pergunta "Multiline string literal in C#" no Stack Overflow acumulou dezenas de milhares de visualizações. E isso não é por acaso. Por muito tempo, C# não foi a linguagem mais amigável para trabalhar com texto multilinha. Mas os tempos estão mudando. Neste artigo, percorreremos o caminho desde soluções improvisadas até as soluções elegantes que surgiram no C# 11.
Se você programa em C# e trabalha com literais de string multilinha, este material economizará horas de pesquisa no Google. Vamos lá!
O Problema: Por que simplesmente pressionar Enter é uma má ideia?
Em C# (assim como em C++), um literal de string é uma sequência de caracteres delimitada por aspas. Uma quebra de linha dentro dessas aspas é um erro de sintaxe. O compilador simplesmente não entenderá onde a string termina.
Veja como NÃO fazer:
// Erro de compilação!string query = "SELECT * FROM UsersWHERE Age > 18ORDER BY Name";O compilador verá "SELECT * FROM Users — e só. O resto é confusão. Antigamente, os desenvolvedores se viravam como podiam. Vamos analisar a evolução das soluções.
O Método Antigo: Verbatim string (@-string) — a salvação
A primeira coisa que vem à mente é o verbatim string literal. Basta colocar @ antes da aspa de abertura. Isso desativa a interpretação de sequências de escape (exceto aspas duplas "").
Mas há um detalhe: os recuos também se tornam parte da string.
Exemplo com verbatim string:
string json = @"{ ""name"": ""Alice"", ""age"": 30}";Console.WriteLine(json);Saída:
{ "name": "Alice", "age": 30}Vantagens:
- Funciona em todas as versões do C#.
- Não é necessário escapar a barra invertida (
\\).
Desvantagens:
- Aspas internas precisam ser duplicadas (
"") — isso é terrível se houver muito JSON. - Recuos à esquerda (espaços/tabulações) entram na string final.
- Não pode ser misturado diretamente com interpolação de strings (
$) (mas pode$@).
Este método ainda é popular, mas para código limpo não é ideal. O verdadeiro avanço aconteceu no C# 11.
O Método Mais Recente: Raw string literal (C# 11 e .NET 7+)
A partir do C# 11, temos o raw string literal — literalmente "literal de string bruto". Ele resolve 99% dos problemas de multilinha.
Sintaxe: três ou mais aspas duplas consecutivas (""").
Exemplo 1: JSON simples sem escape
string json = """ { "name": "Alice", "age": 30 } """;Console.WriteLine(json);Saída:
{ "name": "Alice", "age": 30}Mágica: Aspas dentro da string não precisam ser duplicadas! O compilador entende que a string terminou apenas quando vê três aspas consecutivas.
Exemplo 2: Consulta SQL com recuos
string query = """ SELECT u.Name, o.OrderDate FROM Users u JOIN Orders o ON u.Id = o.UserId WHERE o.Status = 'Active' ORDER BY o.OrderDate DESC """;Console.WriteLine(query);Importante sobre recuos: As aspas de fechamento (""") definem o nível base de recuo. Todas as linhas que tiverem recuo menor que as aspas de fechamento serão cortadas. Isso permite manter a legibilidade do código sem poluir a string com espaços extras.