Övning – Kombinera strängar med hjälp av teckenutrymningssekvenser

Slutförd

Anta att du har blivit ombedd att skapa en modell av ett kommandoradsverktyg som genererar fakturor på både engelska och japanska. Du behöver inte skriva funktionerna som genererar fakturorna ännu. Du behöver bara ange kommandoradsgränssnittet för interna kunder på faktureringsavdelningen för deras godkännande. Chefen bad dig använda formatering så att arbetet med verktyget framgår tydligt. Chefen bad dig även att tillhandahålla instruktioner om att generera fakturor på japanska för de japanska användarna.

Övning – Formatera literalsträngar i C#

I den här övningen lär du dig olika tekniker för att visa specialtecken och lägga till olika formateringstyper i utdata.

Escape-sekvenser för tecken

En escape-teckensekvens är en instruktion till körningen för att infoga ett specialtecken som påverkar utdata från strängen. I C#börjar escape-teckensekvensen med ett omvänt snedstreck \ följt av det tecken som du flyr från. Sekvensen \n lägger till exempel till en ny rad och sekvensen \t lägger till ett tabbtecken.

Följande kod använder escape-teckensekvenser för att lägga till nya radlinjer och flikar:

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

Om du kör koden ser du följande utdata:

Hello
World!
Hello   World!

Hur ska du göra för att lägga till dubbla citattecken i en strängliteral? Om du inte använder escape-sekvensen för tecken förvirrar du kompilatorn eftersom den tror att du vill avsluta strängen i förtid. Kompilatorn förstår inte syftet med tecknen efter det andra dubbla citattecknet.

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

.NET-redigeraren visar en röd vågig linje under World. Men om du försöker köra koden ändå skulle du se följande utdata:

(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

Använd escape-sekvensen för att hantera den \" situationen:

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

Om du kör koden ovan visas följande utdata:

Hello "World"!

Hur ska du göra om du behöver använda ett omvänt snedstreck i andra situationer, till exempel i en filsökväg?

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

Tyvärr reserverar C# omvänt snedstreck för escape-sekvenser, så om du kör koden visar kompilatorn följande fel:

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

Problemet är sekvensen \s. \r Genererar inte ett fel eftersom det är en giltig escape-sekvens för en vagnretur. Du vill dock inte använda en vagnretur i den här kontexten.

För att lösa det här problemet använder \\ du för att visa ett enda omvänt snedstreck.

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

Om du tar bort snedstreckstecknet skapas de utdata som du avsåg:

c:\source\repos

Formatera utdata med hjälp av teckenutrymningssekvenser

  1. Markera all kod i .NET-redigeraren och tryck på Ta bort eller Backspace för att ta bort den.

  2. Om du vill skapa en modell av kommandoradsverktyget anger du följande kod i redigeraren:

    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. Kör sedan koden. Du bör se följande utdata i konsolen:

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

Ordagrann strängliteral

Med en ordagrann strängliteral behåller du alla blanksteg och tecken utan att behöva några escape-sekvenser. Du kan skapa en ordagrann sträng med symbolen @ före strängliteralen.

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

Observera att strängen sträcker sig över två rader och att blanksteget som genereras med C#-instruktionen bevaras i följande utdata.

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

Formatera utdata med ordagranna strängliteraler

  1. Lägg till följande kodrad under koden som du skapade tidigare:

    Console.Write(@"c:\invoices");
    
  2. Kör sedan koden. Du ser följande resultat som innehåller "Utdatakatalogen":

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

Unicode-escape-tecken

Du kan lägga till kodade tecken i strängliteraler med escape-sekvensen \u följt av en kod med fyra tecken som representerar ett Unicode-tecken (UTF-16).

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

Kommentar

Det finns flera saker du måste tänka på här. För det första så kan vissa konsoler, som kommandotolken i Windows, inte visa alla Unicode-tecken. Dessa tecken ersätts med frågetecken i stället. Exemplen som används här är dessutom UTF-16. För vissa tecken krävs UTF-32 och därmed en annan escape-sekvens. Det här är ett komplicerat ämne, och syftet med den här modulen är bara att visa vad du kan göra. Beroende på vilka behov du har kan du behöva ägna mycket tid åt att lära dig arbeta med Unicode-tecken i dina program.

Formatera utdata med unicode-escape-tecken

För att slutföra modellering av kommandoradsverktyget lägger du till en fras på japanska som översätter: "För att generera japanska fakturor". Sedan visar du en ordagrann literalsträng som representerar ett kommando som användaren kan ange. Du lägger också till några escape-sekvenser för formatering.

  1. Lägg till följande kod i programmet:

    // 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. Jämför koden med följande för att se till att koden är korrekt:

    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. Kör sedan koden. Du bör se följande utdata i konsolen:

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

Sammanfattning

Här är vad du har lärt dig om formatering av literalsträngar hittills:

  • Använd escape-sekvenser för tecken när du behöver infoga specialtecken i en strängliteral, som en tabb \t, en radbrytning \n eller ett dubbelt citattecken \".
  • Använd ett omvänt snedstreck \\ som escape-sekvens när du behöver använda omvända snedstreck i andra situationer.
  • @ Använd direktivet för att skapa en ordagrann strängliteral som behåller all blankstegsformatering och omvänt snedstreck i en sträng.
  • Använd \u samt en kod med fyra tecken till att representera Unicode-tecken (UTF-16) i en sträng.
  • Unicode-tecken kanske inte skrivs ut korrekt beroende på programmet.