Øvelse – Kombiner strenge ved hjælp af escape-tegnsekvenser

Fuldført

Lad os antage, at du er blevet bedt om at oprette en mockup af et kommandolinjeværktøj, der genererer fakturaer på både engelsk og japansk. Du behøver ikke at oprette den faktiske funktionalitet, der genererer fakturaer endnu. Du skal kun angive kommandolinjegrænsefladen til interne kunder i faktureringsafdelingen til godkendelse. Din chef har bedt dig om at sikre, at du tilføjer formatering for at rydde den aktuelle status for værktøjet. Din chef har også bedt dig om at angive instruktioner til de japanske brugere om, hvordan fakturaer genereres på japansk.

Øvelse – Formatér konstantstrenge i C#

I denne øvelse lærer du forskellige teknikker til at vise specialtegn og føje forskellige typer formatering til outputtet.

En C#-kodeeditor kan bruges direkte i browseren: C# Code Editor. Denne editor giver et letvægtsmiljø til at skrive, køre og teste C#-kode uden at skulle installere software på din lokale computer.

Escape-sekvenser for tegn

En escape-tegnsekvens er en instruktion til kørselstidspunktet om at indsætte et specialtegn, der påvirker outputtet af strengen. I C#begynder escape-tegnsekvensen med en omvendt skråstreg \ efterfulgt af det tegn, du undslipper. Sekvensen \n tilføjer f.eks. en ny linje, og en \t sekvens tilføjer en fane.

Følgende kode bruger escape-tegnsekvenser til at tilføje nye linjer og faner:

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

Hvis du kører koden, får du vist følgende output:

Hello
World!
Hello   World!

Hvad nu, hvis du har brug for at indsætte et dobbelt anførselstegn i en konstantstreng? Hvis du ikke bruger tegn escape-sekvensen, vil du forvirre compileren, fordi den vil tro, at du vil afslutte strengen for tidligt. Compileren forstår ikke formålet med tegnene efter det andet dobbelte anførselstegn.

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

C#-kodeeditoren vil sætte en rød snoet linje under World. Men hvis du forsøger at køre koden alligevel, får du vist følgende output:

Error summary:
  CS1003: Syntax error, ',' expected
  CS0103: The name 'World' does not exist in the current context
  CS1003: Syntax error, ',' expected

Hvis du vil håndtere denne situation, skal du bruge escape-sekvensen \" :

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

Hvis du kører ovenstående kode, får du vist følgende output:

Hello "World"!

Hvad nu, hvis du har brug for at bruge omvendt skråstreg til andre formål, f.eks. for at få vist en filsti?

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

C# forbeholder sig desværre omvendt skråstreg til escape-sekvenser, så hvis du kører koden, viser compileren følgende fejl:

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

Problemet er sekvensen \s. \r medfører ikke en fejl, fordi det er en gyldig escape-sekvens for en vognretur. Du vil dog ikke bruge en vognretur i denne kontekst.

Du kan løse dette problem ved at bruge \\ til at få vist en enkelt omvendt skråstreg.

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

Hvis du undslipper skråstregen, får du det ønskede output:

c:\source\repos

Formatér output ved hjælp af escape-tegnsekvenser

  1. Markér hele koden i C#-kodeeditoren, og tryk på Delete eller Backspace for at slette den.

  2. Hvis du vil oprette mockup af kommandolinjeværktøjet, skal du angive følgende kode i editoren:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.Write("\nOutput Directory:\t");
    
  3. Kør nu koden. Du får vist følgende resultat i outputkonsollen:

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

Verbatim-strengkonstant

En ordret strengkonstant bevarer alle mellemrum og tegn, uden at det er nødvendigt at undslippe omvendt skråstreg. Hvis du vil oprette en ordret streng, skal du bruge direktivet @ før konstantstrengen.

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

Bemærk, at strengen strækker sig over to linjer, og at det mellemrum, der genereres af denne C#-instruktion, bevares i følgende output.

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

Formatér output ved hjælp af ordret strengkonstanter

  1. Tilføj følgende kodelinje under den kode, du oprettede tidligere:

    Console.Write(@"c:\invoices");
    
  2. Kør nu koden. Du får vist følgende resultat, der indeholder "Outputmappe":

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

Unicode-escapetegn

Du kan også tilføje kodede tegn i konstantstrenge ved hjælp af \u escape-sekvensen og derefter en kode på fire tegn, der repræsenterer et tegn i Unicode (UTF-16).

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

Seddel

Der er flere advarsler her. For det første viser nogle konsoller, f.eks. Windows-kommandoprompten, ikke alle Unicode-tegn. Det erstatter disse tegn med spørgsmålstegnstegn i stedet. De eksempler, der bruges her, er også UTF-16. Nogle tegn kræver UTF-32 og kræver derfor en anden escape-sekvens. Dette er et kompliceret emne, og dette modul sigter kun mod at vise dig, hvad der er muligt. Afhængigt af dit behov skal du muligvis bruge en hel del tid på at lære og arbejde med Unicode-tegn i dine programmer.

Formatér output ved hjælp af Unicode Escape-tegn

Hvis du vil fuldføre mock-up af kommandolinjeværktøjet, skal du tilføje et udtryk på japansk, der oversættes: "Sådan genererer du japanske fakturaer". Derefter får du vist en ordret konstantstreng, der repræsenterer en kommando, som brugeren kan angive. Du skal også tilføje nogle escape-sekvenser til formatering.

  1. Føj følgende kode til dit program:

    // 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. Hvis du vil sikre dig, at din kode er korrekt, skal du sammenligne den med følgende:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.Write("\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 nu koden. Du får vist følgende resultat i outputkonsollen:

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

Resumé

Her er, hvad du har lært om formatering af konstantstrenge indtil videre:

  • Brug escape-sekvenser for tegn, når du skal indsætte et specialtegn i en konstantstreng, f.eks. en fane \t, en ny linje \neller et dobbelt anførselstegn \".
  • Brug et escape-tegn til omvendt skråstreg \\ , når du skal bruge en omvendt skråstreg i alle andre scenarier.
  • Brug direktivet @ til at oprette en ordret strengkonstant, der bevarer al mellemrumsformatering og omvendt skråstreg i en streng.
  • Brug pluskoden \u med fire tegn til at repræsentere Unicode-tegn (UTF-16) i en streng.
  • Unicode-tegn udskrives muligvis ikke korrekt, afhængigt af programmet.