DEV Community

Cover image for Interpolação, Verbatim String Literals, Múltiplas Linhas – Tudo Sobre Strings no C#
Luciano de Almeida Reis
Luciano de Almeida Reis

Posted on • Originally published at blog.lucianoreis.com

Interpolação, Verbatim String Literals, Múltiplas Linhas – Tudo Sobre Strings no C#

Este artigo é uma cópia daquele publicado em meu blog, que estou respostando aqui para testar essa plataforma.
Artigo Original

A linguagem C# faz o tratamento de strings levando em consideração Escape Codes, que são códigos precedidos pelo caracter “\”. Desta forma temos que:

string temp = "C:\\Windows";
// Conteúdo de temp:
C:\Windows
​
string temp = "Fernão \"Capelo\" Gaivota\u0066";
// Conteúdo de temp:
Fernão "Capelo" Gaivota!
​
string temp = "Rio de Janeiro\nBrasil";
// Conteúdo de temp:
Rio de Janeiro
Brasil
Enter fullscreen mode Exit fullscreen mode

Desta forma, se quisermos inserir um texto com múltiplas linhas em uma variável, temos que recorrer a um recurso como:

string temp = "SELECT Nome, Endereco, Telefone " +
    "FROM Cadastro " +
    "WHERE Id = 10 ";
// Conteúdo de temp:
SELECT Nome, Endereco, Telefone FROM Cadastro WHERE Id = 10
Enter fullscreen mode Exit fullscreen mode

Observe que, apesar de escrita em três linhas, foi gerada uma string concatenada com uma única linha. Para que a variável final armazene o texto em múltiplas linhas teria que se colocar “\n” nos pontos onde se deseja fazer as quebras de linha.

Então agora vamos aprender como manipular strings no C# de forma mais eficiente:

Comentários

Essas são as formas de escrever comentários no código C#:

// Comentário com uma única linha

/* Comentário com
múltimplas linhas */

int a = 10;
int b = 20;
int c = 30; // Comentário no final da linha
string rem = a.toString() + /*comentário no meio da linha */ " " + b.toString();

/// Documentação XML
Enter fullscreen mode Exit fullscreen mode

Eu falo um pouco mais sobre documentação XML neste artigo.

Interpolação

Interpolação é o recurso que nos permite inserir tokens no meio da string que serão substituídos em tempo de execução:

// Preparando ambiente
string Nome = "Kelly";
string Idade = 40;
DateTime Agora = DateTime.Now;

// Sem interpolação:
string temp = "Nome: " + Nome + 
    "Idade: "+ Idade.toString() + "anos. " + 
    "Enviado às " + Agora.Hour.toString + ":" + Agora.Minute.toString() + " horas.";

// Com interpolação:
string temp = $"Nome: {Nome}, Idade: {Idade} anos. Enviado às {Agora:HH:mm} Horas.";

// Conteúdo de temp em ambos os casos:
Nome: Kelly, Idade: 40, Enviado às 12:35 Horas.
Enter fullscreen mode Exit fullscreen mode

Para caracterizar que vai utilizar interpolação a string deve iniciar com “$”. Não pode haver espaço entre $ e as aspas. As variáveis ficam entre chaves, conforme exemplo da linha 12 acima:
string temp = $"Nome: {Nome}, Idade: {Idade} anos. Enviado às {Agora:HH:mm} Horas.";

Sintaxe:
{ExpressãoDeInterpolação,Alinhamento:Formato}

  • ExpressãoDeInterpolação: Expressão que produz o resultado a ser formatado. Quando nulo retorna string vazia.
  • Alinhamento: Inteiro que representa a quantidade mínima de caracteres deve ter o resultado. Quando positivo, alinha pela direita, quando negativo alinha pela esquerda.
  • Formato: Formatação que será aplicada. Para detalhes, veja este artigo em Microsoft Learn.

Operações utilizando strings interpoladas:

string strLeft = "Esquerda";
string strRight = "Direita";
string temp = $"|{strLeft,-10}|{strRight,10}|";
// Conteúdo de temp:
// |Esquerda  |   Direita|

string temp = $"{Math.Pi:F3}";
// Conteúdo de temp:
// 3.142

int Nota = 50;
string Nome = "Isaac";
string temp = $"A nota de {Nome} está classificada como {
  Nota switch 
  {
      > 90 => "Excelente",
      > 70 => "Boa",
      > 50 => "Média",
      _ => "Ruim",
  }
  }.";
// Conteúdo de temp:
// A nota de Isaac está classificada como Média.

string temp = $"{Nome} foi {
    (Nota >= 50
     ? "Aprovado"
     : "Reprovado")
     }.";
// Conteúdo de temp:
// Isaac foi Aprovado.


int Idade = 30;
string temp = $"{Nome} tem {Idade} ano{(Idade == 1 ? "" : "s")} de idade.";
// Conteúdo de temp:
// Isaac tem 30 anos de idade.

double VelocidadeDaLuz = 299792.458;
System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("pt-BR");
string temp = $"A velocidade da luz é {VelocidadeDaLuz:N3} km/s.";
// Conteúdo de temp:
// A velocidade da luz é 299.792,458 km/s.

var CulturaEspecifica = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string temp = string.Create(CulturaEspecifica, $"A velocidade da luz é {VelocidadeDaLuz:N3} km/s.");
// Conteúdo de temp:
// A velocidade da luz é 2,99,792.458 km/s.

string temp = string.Create(System.Globalization.CultureInfo.InvariantCulture, $"A velocidade da luz é {VelocidadeDaLuz:N3} km/s.");
// Conteúdo de temp:
// A velocidade da luz é 299,792.458 km/s.
Enter fullscreen mode Exit fullscreen mode

Se precisar escrever tokens {x} dentro de uma string interpolada, basta aumentar o número de $ no início da string. A quantidade de $ será o indicativo de quantas chaves são necessárias para caracterizar um token de de interpolação.

string nome = "Albert";
string temp = $"O seu nome é {nome}.";
// temp:
O seu nome é Albert.

string temp = $$"O seu nome é {nome}.";
// temp:
O seu nome é {nome}.

string temp = $$"O seu nome é {{nome}}.";
// temp:
O seu nome é Albert.
Enter fullscreen mode Exit fullscreen mode

Uma constante pode conter elementos interpolados, desde que esses elementos também sejam constantes:

constant Inventor = "Santos Dumont";
constant eterno = "Quem inventou o avião foi {Nome} e isso não se discute!";
Enter fullscreen mode Exit fullscreen mode

String Literals

Para escrever strings no C# sem levar em consideração os escape codes é necessário recorrer às string literals. Dessa forma é possível até mesmo escrever strings com múltiplas linhas de forma bem mais visualmente amigável. Existem dois tipos: Verbatim String Literals e Raw String Literals, sendo que a segunda possui mais recursos.

Verbatim String Literals

Uma Verbatim String Literal é caracterizada pelo @ no início da formação. Pode ser em qualquer ordem @” ou “@.
Exemplo mostrando a mesma string escrito da forma padrão e da forma Verbatim:

string temp1 = "C:\\Temp\\Aula1";
string temp2 = @"C:\Temp\Aula1";

// O conteúdo das duas strings é:
C:\Temp\Aula1
Enter fullscreen mode Exit fullscreen mode

O único código especial dentro de uma Verbatim string é “, que deve ser representado como “”.
string temp = @"O nome do livro é ""João e Maria"".";
É possível também utilizar comandos do C# com o identificador Verbatim. No exemplo abaixo, vou criar um objeto com o nome for e outro com o nome if:
string[] @for = {"VW","Audi","Porsche"};
string @if = "Mercedes-Benz";

E ainda podemos utilizar um recurso interessante de interpolação utilizando o código acima, dessa forma:

string[] @for = {"VW","Audi","Porsche"};
for (int i = 0; i < @for.length; i++)
{
  Console.WriteLine($"Trabalhamos com {@for[i]}.");
}
// Resultado:
// Trabalhamos com VW.
// Trabalhamos com Audi.
// Trabalhamos com Porsche.
Enter fullscreen mode Exit fullscreen mode

Usando Verbatim Literals para escrever uma string multi-linhas:

string cmdSQL = @"SELECT Nome, Endereco, Telefone
FROM Cadastro 
WHERE Id = 10";

int id = 10;
strint cmdSQL = $@"SELECT Nome, Endereco, Telefone
FROM Cadastro
WHERE Id = {id}";
Enter fullscreen mode Exit fullscreen mode

Raw String Literals

É outra forma de escrever strings de forma literal, sem os escape codes, porém de uma forma ainda mais amigável que Verbatim String Literals. Uma Raw String Literal deve estar contida entre, no mínimo 3 aspas. Dessa forma:

string temp = """Isso é uma raw string que pode conter \ e "".";
// Resultado de temp:
Isso é uma raw string que pode conter \ e ".
Enter fullscreen mode Exit fullscreen mode

Raw strings também podem ser combinadas com interpolação:

string Nome = "Nikola Tesla";
string temp = $"""O {Nome} foi um grande "gênio".""";
// Resultado de temp:
// O Nikola Tesla foi um grande "gênio".
Enter fullscreen mode Exit fullscreen mode

Mas as raw strings se destacam mesmo na hora de escrever strings com múltiplas linhas porque, ao contrário das verbatim strings, que fazem uma bagunça com a identação, as raw strings fazem um belo controle deste recurso, por exemplo:

ATENÇÃO: Este exemplo é apenas para fins didáticos. Nunca utilize concatenação ou interpolação de strings para escrever uma SQL Query. Isso irá deixá-la extremamente suscetível a um tipo de ataque chamado SQL Injection.

int id = 10;
string sqlCmd = $"""
  SELECT Nome, Endereco, Telefone
  FROM Cadastro
    INNER JOIN Profissoes
      ON Profissao = Profissoes
  WHERE Id = {id}
  """;
Enter fullscreen mode Exit fullscreen mode

Vai gerar o seguinte resultado em sqlCmd:

SELECT Nome, Endereco, Telefone
FROM Cadastro
  INNER JOIN Profissoes
    ON Profissao = Profissoes
WHERE Id = 10
Enter fullscreen mode Exit fullscreen mode

Observe que:

  • A primeira e a última quebra de linha foram suprimidas, mantendo apenas o conteúdo contido entre os delimitadores da raw string.
  • Os espaços de identação também foram suprimidos, mantendo a identação apenas no código, para melhor organização porém eliminando-a no resultado final.
  • A string começa e termina com quebras de linha.
  • Espaços em branco após as aspas de abertura, na primeira linha são ignorados.
  • Linhas vazias no conteúdo da raw strings são respeitadas.
  • Se as aspas de fechamento não estiverem seguindo o padrão de identação, a string será interpretada como uma verbatim string.

Top comments (0)