Esercizio - Combinare stringhe usando sequenze di escape di caratteri

Completato

Si supponga che all'utente sia stato chiesto di creare un mockup di uno strumento da riga di comando che genererà fatture sia in inglese che in giapponese. Non è ancora necessario creare la funzionalità effettiva per la generazione di fatture. È sufficiente fornire l'interfaccia della riga di comando ai clienti interni del reparto fatturazione per l'approvazione. Il responsabile ha chiesto di assicurarsi di aggiungere la formattazione per rendere chiaro lo stato di avanzamento dello strumento. Ha chiesto anche di fornire istruzioni per gli utenti giapponesi su come generare fatture in giapponese.

Esercizio - Formattare le stringhe letterali in C#

In questo esercizio si apprenderanno diverse tecniche per visualizzare caratteri speciali e aggiungere diversi tipi di formattazione all'output.

Sequenze di escape dei caratteri

Una sequenza di caratteri di escape è un'istruzione per il runtime che inserisce un carattere speciale che influirà sull'output della stringa. In C#, la sequenza di caratteri di escape inizia con una barra rovesciata \ seguita dal carattere di escape. Ad esempio, la sequenza \n aggiungerà una nuova riga, mentre la sequenza \t aggiungerà una tabulazione.

Il codice seguente usa sequenze di caratteri di escape per aggiungere nuove righe e schede:

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

Se si esegue il codice, viene visualizzato l'output seguente:

Hello
World!
Hello   World!

Cosa accade se occorre inserire le virgolette doppie in una stringa letterale? Se non si usa la sequenza di caratteri di escape, si creerà confusione nel compilatore che penserà che l'utente intenda terminare la stringa in modo anomalo. Il compilatore non comprenderà lo scopo dei caratteri dopo la seconda virgoletta doppia.

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

Nell'editor .NET comparirà una riga rossa ondulata sotto World. Ma se si tenta di eseguire comunque il codice, verrà visualizzato l'output seguente:

(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

Per gestire questa situazione, usare la sequenza di escape \":

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

Se si esegue il codice riportato in precedenza, verrà visualizzato l'output seguente:

Hello "World"!

Cosa accade se occorre usare la barra rovesciata per altri scopi, ad esempio per visualizzare un percorso file?

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

Sfortunatamente, C# riserva la barra rovesciata per le sequenze di escape, pertanto se si esegue il codice, il compilatore visualizzerà l'errore seguente:

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

Il problema è la sequenza \s. \r non genera un errore perché è una sequenza di escape valida per un ritorno a capo. Tuttavia, non si vuole usare un ritorno a capo in questo contesto.

Per risolvere questo problema, usare \\ per visualizzare una barra rovesciata singola.

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

L'applicazione di una sequenza di escape al carattere barra rovesciata produce l'output desiderato:

c:\source\repos

Formattare l'output usando sequenze di escape di caratteri

  1. Selezionare tutto il codice nell'editor .NET e quindi premere Canc o BACKSPACE per eliminarlo.

  2. Per creare il mockup dello strumento da riga di comando, immettere il codice seguente nell'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. A questo punto, eseguire il codice. Nella console di output verrà visualizzato il risultato seguente:

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

Valore letterale di stringa verbatim

Un valore letterale di stringa verbatim manterrà tutti gli spazi vuoti e i caratteri senza la necessità di applicare una sequenza di escape alla barra rovesciata. Per creare una stringa verbatim, usare la direttiva @ prima della stringa letterale.

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

Si noti che la stringa si estende su due righe e lo spazio vuoto generato da questa istruzione C# viene mantenuto nell'output seguente.

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

Formattare l'output usando valori letterali di stringa verbatim

  1. Aggiungere la riga di codice seguente sotto il codice creato in precedenza:

    Console.Write(@"c:\invoices");
    
  2. A questo punto, eseguire il codice. Verrà visualizzato il risultato seguente che include la "Directory di output":

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

Caratteri di escape Unicode

È anche possibile aggiungere caratteri codificati in stringhe letterali usando la sequenza di escape \u, quindi un codice di quattro caratteri che rappresenta un carattere in Unicode (UTF-16).

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

Nota

È necessario valutare diversi aspetti. In primo luogo, alcune console come il prompt dei comandi di Windows non visualizzeranno tutti i caratteri Unicode, Sostituirà questi caratteri con caratteri di punto interrogativo. Inoltre, gli esempi usati in questo modulo sono UTF-16. Alcuni caratteri richiedono UTF-32, pertanto è necessaria una sequenza di escape diversa. Si tratta di un argomento complesso e questo modulo mira semplicemente a illustrare gli scenari possibili. A seconda delle esigenze, potrebbe essere necessario dedicare altro tempo alla formazione e alla pratica con l'uso dei caratteri Unicode nelle applicazioni.

Formattare l'output usando caratteri di escape Unicode

Per completare il mock-up dello strumento da riga di comando, si aggiungerà una frase in giapponese che traduce: "Per generare fatture giapponesi". Verrà quindi visualizzata una stringa letterale verbatim che rappresenta un comando che l'utente può immettere. Verranno anche aggiunte alcune sequenze di escape per la formattazione.

  1. Aggiungere il codice seguente all'applicazione:

    // 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. Per assicurarsi che il codice sia corretto, confrontarlo con quanto segue:

    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. A questo punto, eseguire il codice. Nella console di output verrà visualizzato il risultato seguente:

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

Riepilogo

Ecco quanto si è appreso sulla formattazione delle stringhe letterali finora:

  • Usare sequenze di caratteri di escape quando occorre inserire un carattere speciale in una stringa letterale, come una tabulazione \t, una nuova riga \n o le virgolette doppie \".
  • Usare un carattere di escape per la barra rovesciata \\ quando è necessario usare una barra rovesciata in tutti gli altri scenari.
  • Usare la direttiva @ per creare un valore letterale di stringa verbatim che mantenga tutti i caratteri di barra rovesciata e formattazione degli spazi vuoti in una stringa.
  • Usare \u più un codice di quattro caratteri per rappresentare i caratteri Unicode (UTF-16) in una stringa.
  • I caratteri Unicode potrebbero non essere visualizzati correttamente a seconda dell'applicazione.