練習 - 使用字元逸出序列合併字串

已完成

假設您被要求建立將會同時以英文與日文產生發票之命令列工具的原型。 您還不需要建置會產生發票的實際功能。 您只需要提供命令列介面給帳務部門的內部客戶以取得其核准。 您的經理要求您確定您新增格式設定以讓工具的目前進度更清楚。 您的經理也要求您提供有關如何以日文產生發票的指示給日文使用者。

練習 - 以 C# 格式化常值字串

在此練習中,您將瞭解顯示特殊字元的不同技巧,並將不同類型的格式設定新增至輸出。

字元逸出序列

逸出字元序列 是執行階段的指示,用以插入將會影響字串輸出的特殊字元。 在 C# 中,逸出字元序列的開頭是反斜線 \,後面接著您要逸出的字元。 例如,\n 序列會新增一行,而 \t 序列會新增定位字元。

下列程式碼使用逸出字元序列來新增新行和索引標籤:

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

若您執行程式碼,則會看到下列輸出:

Hello
World!
Hello   World!

若您需要在常值字串中插入雙引號該怎麼辦? 若未使用字元逸出序列,編譯器將會搞混,因為它將會認為您想要永久終止該字串。 編譯器不會瞭解第二個雙引號之後字元的用途。

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

.NET 編輯器將會在 World 下放置紅色彎曲線。 但若您仍嘗試執行該程式碼,您會看到下列輸出:

(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

若要處理該情況,請使用 \" 逸出序列:

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

若您執行上面的程式碼,您將會看到下列輸出:

Hello "World"!

若您需要使用反斜線作為另一個用途 (如顯示檔案路徑) 該怎麼辦?

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

不幸的是,C# 保留反斜線作為逸出序列,因此若您執行該程式碼,編譯器將會顯示下列錯誤:

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

問題是序列 \s\r 不會產生錯誤,因為其是代表歸位字元的有效逸出序列。 不過,您不想在此內容中使用歸位字元。

若要解決此問題,您可以使用 \\ 來顯示單一反斜線。

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

逸出反斜線字元可產生您要的輸出:

c:\source\repos

使用字元逸出序列格式化輸出

  1. 在 .NET 編輯器中選取所有程式碼,並按刪除鍵退格鍵以刪除該程式碼。

  2. 若要為命令列工具建立原型,請在編輯器中輸入下列程式碼:

    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. 現在,執行程式碼。 您會在輸出主控台中看到下列結果:

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

逐字字串常值

逐字字串常值將會保留所有空白與字元,您不需要逸出反斜線。 若要建立逐字字串,請在常值字串前面使用 @ 指示詞。

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

請注意,在下列輸出中,字串會跨兩行且會保留此 C# 指令產生的空白。

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

使用逐字字串常值格式化輸出

  1. 將下列程式碼新增到您先前建立的程式碼下方:

    Console.Write(@"c:\invoices");
    
  2. 現在,執行程式碼。 您會看到包含「輸出目錄」的下列結果:

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

Unicode 逸出字元

您也可以透過使用 \u 逸出序列,然後新增代表某些 Unicode (UTF-16) 字元的四字元代碼,以在常值字串中新增已編碼的字元。

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

注意

這裡會發生幾種情況。 首先,某些主控台 (如 Windows 命令提示字元) 將無法顯示所有 Unicode 字元。 這會將那些字元取代為問號。 此外,這裡使用的範例是 UTF-16。 某些字元需要 UTF-32,因此需要不同的逸出序列。 這是複雜主題,而且此課程模組旨在說明可以執行的動作。 視您的需求而定,您可能必須花費相當的時間來學習及在您的應用程式中使用 Unicode 字元。

使用 Unicode 逸出字元格式化輸出

若要完成命令列工具的模擬,您將以日文新增片語,翻譯:「產生日文發票」。 然後,您將顯示逐字常值字串,代表使用者可以輸入的命令。 您也將新增一些逸出序列以進行格式設定。

  1. 將下列程式碼新增到您的應用程式:

    // 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. 若要確保您的程式碼正確,請將其與下列項目進行比較:

    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. 現在,執行程式碼。 您會在輸出主控台中看到下列結果:

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

概括回顧

以下是您到目前為止已瞭解格式化常值字串的內容:

  • 當您需要插入特殊字元 (如定位字元 \t、新行 \n 或雙引號 \") 到常值字串時,請使用字元逸出序列。
  • 當您必須在所有其他案例中使用反斜線時,請為反斜線使用逸出字元 \\
  • 使用 @ 指示詞建立逐字字串常值,並保留字串中的所有空白字元格式設定和反斜線字元。
  • 使用 \u 加上四字元代碼來代表字串中的 Unicode 字元 (UTF-16)。
  • 視應用程式而定,Unicode 字元可能無法正確列印。