Exercício - Combine cadeias de caracteres usando sequências de escape de caracteres

Concluído

Suponha que você tenha sido solicitado a criar uma maquete de uma ferramenta de linha de comando que gerará faturas em inglês e japonês. Ainda não precisa de criar a funcionalidade real que gera as faturas. Você só precisa fornecer a interface de linha de comando aos clientes internos no departamento de faturamento para sua aprovação. O gestor pediu que adicionasse formatação para simplificar o progresso atual da ferramenta. O gestor também lhe pediu que fornecesse instruções para os utilizadores japoneses sobre como gerar faturas em japonês.

Exercício - Formatar cadeias literais em C#

Neste exercício, você aprenderá diferentes técnicas para exibir caracteres especiais e adicionar diferentes tipos de formatação à saída.

Sequências de fuga de personagens

Uma sequência de caracteres de escape é uma instrução para o tempo de execução para inserir um caractere especial que afetará a saída da sua cadeia de caracteres. Em C#, a sequência de caracteres de fuga começa com uma barra \ invertida seguida pelo personagem que você está escapando. Por exemplo, a sequência \n adicionará uma nova linha e uma sequência \t adicionará uma tabulação.

O código a seguir usa sequências de caracteres de escape para adicionar novas linhas e guias:

Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");

Se executar o código, verá o seguinte resultado:

Hello
World!
Hello   World!

E, se precisar de inserir aspas duplas numa cadeia de carateres literal? Se você não usar a sequência de escape de caracteres, você confundirá o compilador porque ele pensará que você deseja encerrar a string prematuramente. O compilador não entenderá o propósito dos caracteres após a segunda aspa dupla.

Console.WriteLine("Hello "World"!");

O Editor .NET colocará uma linha ondulada vermelha em World. Mas se você tentar executar o código de qualquer maneira, você verá a seguinte saída:

(1,27): error CS1003: Syntax error, ',' expected
(1,27): error CS0103: The name 'World' does not exist in the current context
(1,32): error CS1003: Syntax error, ',' expected

Para lidar com essa situação, use a \" sequência de escape:

Console.WriteLine("Hello \"World\"!");

Se você executar o código acima, você verá a seguinte saída:

Hello "World"!

E, se precisar de utilizar a barra invertida para outras finalidades, como apresentar um caminho de ficheiro?

Console.WriteLine("c:\source\repos");

Infelizmente, o C# reserva a barra invertida para sequências de escape, portanto, se você executar o código, o compilador exibirá o seguinte erro:

(1,22): error CS1009: Unrecognized escape sequence

O problema é a sequência \s. O \r não produz um erro porque é uma sequência de escape válida para um retorno de carro. No entanto, você não deseja usar um retorno de carro neste contexto.

Para resolver esse problema, use o \\ para exibir uma única barra invertida.

Console.WriteLine("c:\\source\\repos");

Escapar do caractere de barra invertida produz a saída pretendida:

c:\source\repos

Formatar saída usando sequências de escape de caracteres

  1. Selecione todo o código no Editor .NET e pressione Delete ou Backspace para excluí-lo.

  2. Para criar o modelo da ferramenta de linha de comando, digite o seguinte código no editor:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    
  3. Agora, execute o código. Verá o seguinte resultado na consola de saída:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:    
    

Literal de cadeia de caracteres verbatim

Um literal de cadeia de carateres textual manterá todos os espaços em branco e os carateres sem a necessidade de utilizar o caráter de escape para a barra invertida. Para criar uma cadeia de carateres textual, utilize a diretiva @ antes da cadeia de carateres literal.

Console.WriteLine(@"    c:\source\repos    
        (this is where your code goes)");

Repare que a cadeia de carateres abrange duas linhas e o espaço em branco gerado por esta instrução do C# é mantido na saída seguinte.

    c:\source\repos    
        (this is where your code goes)

Formatar saída usando literais de cadeia de caracteres literais

  1. Adicione a seguinte linha de código abaixo do código que você criou anteriormente:

    Console.Write(@"c:\invoices");
    
  2. Agora, execute o código. Você verá o seguinte resultado que inclui o "Diretório de saída":

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:
    c:\invoices
    

Caracteres de escape Unicode

Também pode adicionar carateres codificados em cadeias literais com a sequência de escape \u e, em seguida, um código de quatro carateres a representar algum caráter em Unicode (UTF-16).

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

Nota

Há várias limitações aqui. Primeiro, algumas consolas, como a Linha de Comandos do Windows, não apresentarão todos os carateres Unicode. Em vez disso, ele substituirá esses caracteres por caracteres de ponto de interrogação. Além disso, os exemplos utilizados aqui são em UTF-16. Alguns carateres exigem UTF-32 e, portanto, exigem uma sequência de escape diferente. Este é um assunto complexo e este módulo só visa mostrar o que é possível. Dependendo da sua necessidade, talvez seja necessário gastar algum tempo a aprender e a trabalhar com carateres Unicode nas suas aplicações.

Formatar saída usando caracteres de escape unicode

Para concluir a maquete da ferramenta de linha de comando, você adicionará uma frase em japonês que se traduz: "Para gerar faturas japonesas". Em seguida, você exibirá uma cadeia de caracteres literal literal que representa um comando que o usuário pode inserir. Você também adicionará algumas sequências de escape para formatação.

  1. Adicione o seguinte código ao seu aplicativo:

    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  2. Para garantir que seu código esteja correto, compare-o com o seguinte:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    Console.Write(@"c:\invoices");
    
    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  3. Agora, execute o código. Verá o seguinte resultado na consola de saída:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021            Complete!
    Invoice: 1022            Complete!
    
    Output Directory:
    c:\invoices
    
    日本の請求書を生成するには:
        c:\invoices\app.exe -j
    

Recapitulação

Aqui está o que você aprendeu sobre a formatação de cadeias de caracteres literais até agora:

  • Utilize as sequências de escape de carateres quando precisar de inserir um caráter especial numa cadeia de carateres literal, como uma tabulação \t, uma nova linha \n ou uma aspa dupla \".
  • Utilize um caráter de escape para a barra invertida \\ quando precisar de utilizar uma barra invertida em todos os outros cenários.
  • Use a diretiva para criar um literal de cadeia de caracteres literal que mantém toda a @ formatação de espaço em branco e caracteres de barra invertida em uma cadeia de caracteres.
  • Utilize \u e um código de quatro carateres para representar carateres Unicode (UTF-16) numa cadeia de carateres.
  • Os caracteres Unicode podem não ser impressos corretamente, dependendo do aplicativo.