Exercício – Combinar cadeias de caracteres usando sequências de escape de caracteres
Imagine que o seu gerente pediu que você criasse um modelo de uma ferramenta de linha de comando para gerar faturas em inglês e em japonês. Você não precisa criar a funcionalidade real que gera as faturas ainda. Você só precisará fornecer a interface de linha de comando para clientes internos no departamento de cobrança para aprovação. Seu gerente pediu para você ter certeza de que adicionou formatação para tornar claro o progresso atual da ferramenta. Seu gerente também pediu para fornecer instruções para os usuários japoneses sobre como gerar faturas em japonês.
Exercício – Formatar cadeias de caracteres literais em C#
Neste exercício, você aprenderá técnicas diferentes para exibir caracteres especiais e adicionar diferentes tipos de formatação à saída.
Sequências de escape de caractere
Uma sequência de caracteres de escape é uma instrução especial para que o runtime insira um caractere especial que afetará a saída da cadeia de caracteres. Em C#, a sequência de caracteres de escape começa com uma barra invertida \
seguida pelo caractere que será escapado. Por exemplo, a sequência \n
adicionará uma nova linha e uma sequência \t
adicionará uma guia.
O seguinte código usa sequências de caracteres de escape para adicionar linhas e guias:
Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");
Se executar o código, você verá a saída a seguir:
Hello
World!
Hello World!
E se você precisar inserir uma aspa dupla em uma cadeia de caracteres literal? Se você não usar a sequência de escape de caracteres, confundirá o compilador, pois ele achará que você deseja terminar a cadeia de caracteres prematuramente. O compilador não entenderá a finalidade dos caracteres após a segunda aspa dupla.
Console.WriteLine("Hello "World"!");
O Editor .NET colocará uma linha ondulada vermelha em World
. No entanto, se você tentar executar o código mesmo assim, 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 isso, use a sequência de escape \"
:
Console.WriteLine("Hello \"World\"!");
Se você executar o código acima, verá a seguinte saída:
Hello "World"!
E se você precisar usar a barra invertida para outras finalidades, como exibir um caminho de arquivo?
Console.WriteLine("c:\source\repos");
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
. \r
não produz um erro porque é uma sequência de escape válida para um retorno de carro. No entanto, não é recomendado usar um retorno de carro neste contexto.
Para resolver o problema, use \\
para exibir uma barra invertida simples.
Console.WriteLine("c:\\source\\repos");
O escape do caractere de barra invertida produz a saída desejada:
c:\source\repos
Formatar a saída usando sequências de escape de caracteres
Selecione todo o código no Editor do .NET e pressione a tecla Delete ou Backspace para excluir.
Para criar o modelo da ferramenta de linha de comando, adicione o seguinte código ao 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");
Agora, execute o código. Você verá o resultado a seguir no console 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 caracteres textual manterá todo o espaço em branco e os caracteres sem a necessidade de escapar da barra invertida. Para criar uma cadeia de caracteres textual, use a diretiva @
antes da cadeia de caracteres literal.
Console.WriteLine(@" c:\source\repos
(this is where your code goes)");
Observe que a cadeia de caracteres abrange duas linhas e o espaço em branco gerado por essa instrução do C# é mantido na saída a seguir.
c:\source\repos
(this is where your code goes)
Formatar a saída usando literais de cadeia de caracteres verbatim
Adicione a seguinte linha de código abaixo do código que você criou anteriormente:
Console.Write(@"c:\invoices");
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
Você também pode adicionar caracteres codificados em cadeias de caracteres literais usando a sequência de escape \u
e, em seguida, um código de quatro caracteres representando algum caractere em Unicode (UTF-16).
// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");
Observação
Existem várias advertências. Primeiro, alguns consoles, como o prompt de comando do Windows, não exibirão todos os caracteres Unicode. Ele substituirá esses caracteres por caracteres de ponto de interrogação. Além disso, os exemplos usados aqui são UTF-16. Alguns caracteres exigem UTF-32 e, portanto, exigem uma sequência de escape diferente. Esse é um assunto complicado, e este módulo pretende apenas mostrar o que é possível. Dependendo de sua necessidade, talvez seja necessário gastar bastante tempo aprendendo e trabalhando com caracteres Unicode em seus aplicativos.
Formatar a saída usando caracteres de escape Unicode
Para concluir o modelo da ferramenta de linha de comando, você adicionará uma frase em japonês que tem a seguinte tradução: "para gerar faturas em japonês". Em seguida, você exibirá uma cadeia de caracteres verbatim literal que representa um comando que o usuário pode inserir. Você também adicionará algumas sequências de escape para a formatação.
Adicione o código a seguir à sua página:
// 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");
Para garantir que o 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");
Agora, execute o código. Você verá o resultado a seguir no console 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
Veja o que você aprendeu sobre a formatação de cadeias de caracteres literais até agora:
- Use as sequências de escape de caractere quando precisar inserir um caractere especial em uma cadeia de caracteres literal, como uma tabulação
\t
, uma nova linha\n
ou uma aspa dupla\"
. - Use um caractere de escape para a barra invertida
\\
quando precisar usar uma barra invertida em todos os outros cenários. - Use a diretiva
@
para criar um literal de cadeia de caracteres que mantenha toda a formatação de espaço em branco e caracteres de barra invertida em uma cadeia de caracteres. - Use o
\u
mais um código de quatro caracteres para representar caracteres Unicode (UTF-16) em uma cadeia de caracteres. - Os caracteres Unicode podem não ser impressos corretamente dependendo do aplicativo.