Oefening: tekenreeksen combineren met escapereeksen voor tekens

Voltooid

Stel dat u bent gevraagd om een mockup te maken van een opdrachtregelprogramma waarmee facturen worden gegenereerd in zowel het Engels als het Japans. U hoeft nog niet de functionaliteit voor het genereren van facturen te maken. U hoeft alleen de opdrachtregelinterface op te geven aan interne klanten op de factureringsafdeling voor hun goedkeuring. Uw manager heeft u verzocht opmaak toe te voegen om de huidige voortgang van het hulpprogramma duidelijk te maken. Uw manager heeft u ook gevraagd instructies voor het genereren van facturen in het Japans aan te bieden voor de Japanse gebruikers.

Oefening: letterlijke tekenreeksen opmaken in C#

In deze oefening leert u verschillende technieken om speciale tekens weer te geven en verschillende typen opmaak toe te voegen aan de uitvoer.

Escapereeksen voor tekens

Een escape-tekenreeks is een instructie voor de runtime om een speciaal teken in te voegen dat van invloed is op de uitvoer van uw tekenreeks. In C# begint de escape-tekenreeks met een backslash \ gevolgd door het teken dat u uitkomt. Met de reeks \n wordt bijvoorbeeld een nieuwe regel toegevoegd en met de reeks \t wordt tab toegevoegd.

De volgende code maakt gebruik van escape-tekenreeksen om nieuwe regels en tabbladen toe te voegen:

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

Wanneer u de code uitvoert, ziet u de volgende uitvoer:

Hello
World!
Hello   World!

Wat moet u doen als u een dubbel aanhalingsteken in een letterlijke tekenreeks wilt invoegen? Als u de escapereeks voor tekens niet gebruikt, verwart u de compiler omdat u denkt dat u de tekenreeks voortijdig wilt beëindigen. De compiler begrijpt het doel van de tekens niet na het tweede dubbele aanhalingsteken.

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

In de .NET-editor verschijnt een golvende rode lijn onder World. Maar als u de code toch probeert uit te voeren, ziet u de volgende uitvoer:

(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

Gebruik de \" escape-reeks om deze situatie te verwerken:

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

Als u de bovenstaande code uitvoert, ziet u de volgende uitvoer:

Hello "World"!

Wat moet u doen als u de backslash voor andere doeleinden wilt gebruiken, bijvoorbeeld om een bestandspad weer te geven?

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

Helaas reserveert C# de backslash voor escape-reeksen, dus als u de code uitvoert, wordt de volgende fout weergegeven in de compiler:

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

Het probleem is de reeks \s. Er \r wordt geen fout gegenereerd omdat het een geldige escape-reeks is voor een regelterugloop. In deze context wilt u echter geen regelterugloop gebruiken.

U kunt dit probleem oplossen door één \\ backslash weer te geven.

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

Als u de back-slash wilt ontsnappen, wordt de uitvoer geproduceerd die u hebt bedoeld:

c:\source\repos

Uitvoer opmaken met escapereeksen voor tekens

  1. Selecteer alle code in de .NET-editor en druk op Delete of Backspace om deze te verwijderen.

  2. Als u de mockup van het opdrachtregelprogramma wilt maken, voert u de volgende code in de editor in:

    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. Voer de code nu uit. U ziet het volgende resultaat in de uitvoerconsole:

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

Letterlijke letterlijke verbatimtekenreeks

Met een letterlijke verbatimtekenreeks blijven alle spaties en tekens behouden zonder dat u een escapeteken voor de backslash nodig hebt. U maakt een verbatimtekenreeks door de instructie @ vóór de letterlijke tekenreeks te gebruiken.

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

Zoals u ziet, beslaat de tekenreeks twee regels en blijft de spatie die met deze C#-instructie wordt gegenereerd behouden in de volgende uitvoer.

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

Uitvoer opmaken met letterlijke woordreeksen

  1. Voeg de volgende regel code toe onder de code die u eerder hebt gemaakt:

    Console.Write(@"c:\invoices");
    
  2. Voer de code nu uit. U ziet het volgende resultaat met de uitvoermap:

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

Unicode-escapetekens

U kunt ook gecodeerde tekens toevoegen aan letterlijke tekenreeksen met behulp van de escapereeks \u, gevolgd door een code van vier tekens die staat voor een bepaald teken in Unicode (UTF-16).

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

Notitie

Er zijn enkele aandachtspunten. Om te beginnen worden in bepaalde consoles, zoals de Windows-opdrachtprompt, niet alle Unicode-tekens weergegeven. In plaats daarvan worden deze tekens vervangen door vraagtekentekens. Verder is in deze voorbeelden UTF-16 gebruikt. Voor sommige tekens is UTF-32 nodig en daarom ook een andere escapereeks. Dit is een gecompliceerd onderwerp en in deze module wordt alleen aangegeven wat er mogelijk is. Afhankelijk van uw behoefte kan het enige tijd vergen om Unicode-tekens te leren kennen en in uw toepassingen te gebruiken.

Uitvoer opmaken met unicode-escapetekens

Als u de mock-up van het opdrachtregelprogramma wilt voltooien, voegt u een woordgroep toe in het Japans die vertaalt: 'Om Japanse facturen te genereren'. Vervolgens geeft u een letterlijke letterlijke tekenreeks weer die een opdracht vertegenwoordigt die de gebruiker kan invoeren. U voegt ook enkele escapereeksen toe voor opmaak.

  1. Voeg de volgende code toe aan uw toepassing:

    // 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. Als u wilt controleren of uw code juist is, vergelijkt u deze met het volgende:

    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. Voer de code nu uit. U ziet het volgende resultaat in de uitvoerconsole:

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

Samenvatting

Dit is wat u tot nu toe hebt geleerd over het opmaken van letterlijke tekenreeksen:

  • Gebruik escapereeksen voor tekens wanneer u een speciaal teken wilt invoegen aan een letterlijke tekenreeks, zoals een tab \t, een nieuwe regel \n of een dubbel aanhalingsteken \".
  • Gebruik een escapeteken voor de backslash \\ wanneer u in alle andere scenario's een backslash wilt gebruiken.
  • Gebruik de @ instructie om een letterlijke letterlijke verbatimtekenreeks te maken die alle witruimteopmaak en backslashtekens in een tekenreeks bewaart.
  • Gebruik de \u plus een code van vier tekens als representatie van Unicode-tekens (UTF-16) in een tekenreeks.
  • Unicode-tekens worden mogelijk niet correct afgedrukt, afhankelijk van de toepassing.