The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

彙整從 C# 1.0 到 C# 11.0 的字串格式變化

我昨天在整理 C# 到底有多少字串的表示法,原本想說應該五六個吧,整理到越後面越多,整理出了 11 種不同的語法,真的到了讓人眼花撩亂的地步。今天這篇文章就我就整理一下我的研究心得。

C# Strings

我從 The history of C#C# reference 特別翻出了特定 C# 語法的版本資訊,以下從舊版到新版整理給大家參考。

  • C# 1.0 Regular string literals

    最原始的字串表示法,遇到雙引號要改用 \" 才行!

    string name = "you";
    
    string s1 = "I think \r\n  \"" + name + "\"\r\nare awesome!";
    s1.Dump("C# 1.0 Regular string literals- \"\"");
    

    C# 1.0 Regular string literals

  • C# 1.0 Verbatim string literals

    你可以直接在字串中加入「斷行符號」且不需要用 \r\n 跳脫字元,但雙引號要改用 "" 才行!

    string s2 = @"I think
      """ + name + @"""
    are awesome!";
    s2.Dump("C# 1.0 Verbatim string literals - @\"\" - Multiline");
    

    C# 1.0 Verbatim string literals

  • C# 6.0 Interpolated Strings

    透過 $"..." 可以做到「字串內插」的表達方式,字串中的 {name} 可以用來插入其他變數!

    string name = "you";
    
    string s3 = $"I think \r\n  \"{name}\"\r\nare awesome!";
    s3.Dump("C# 6.0 Interpolated Strings - $\"\"");
    

    C# 6.0 Interpolated Strings

  • C# 8.0 Interpolated Verbatim Strings

    你可以使用 @$"..."$@"..." 語法,混合 Verbatim string literalsInterpolated Strings 的表達方式!

    string name = "you";
    
    string s4 = $@"I think
      ""{name}""
    are awesome!";
    s4.Dump("C# 8.0 Interpolated Verbatim Strings - $@\"\"");
    
    string s5 = @$"I think
      ""{name}""
    are awesome!";
    s5.Dump("C# 8.0 Interpolated Verbatim Strings - @$\"\"");
    

    C# 8.0 Interpolated Verbatim Strings

  • C# 10.0 Constant interpolated strings

    你可以將字串設定為 const (常數) 時,也同時使用 $ 字串內插的表達方式!

    const string Language = "C#";
    const string Platform = ".NET";
    const string Version = "10.0";
    const string s6 = $"{Platform} - Language: {Language} Version: {Version}";
    s6.Dump("C# 10.0 Constant interpolated strings - const string x = $\"\"");
    

    C# 10.0 Constant interpolated strings

  • C# 11.0 Raw string literal

    終於可以在 C# 寫雙引號不用寫成 \""" 的樣子了,這樣蠻好的!

    string s7 = """
                I think "you" are awesome!
                """;
    s7.Dump("C# 11.0 Raw string literal - Multiline");
    
    string s8 = """I think "you" are awesome!""";
    s8.Dump("C# 11.0 Raw string literal - Singleline");
    

    C# 11.0 Raw string literal

    如果你要在 C# 字串中寫上 JSON 內容,且包含很多 {} 符號時,透過這種於法也可以很乾淨的書寫!👍

  • C# 11.0 Interpolated raw string literal

    如果你想在這種格式加入「內插變數」的功能,字串前面加上一個 $ 符號即可使用 {name} 語法來內插變數,不過這種用法就無法輸出 {} 符號到字串中了:

    string s9 = $"""
                I think "{name}" are awesome!
                """;
    s9.Dump("C# 11.0 Interpolated raw string literal - Multiline");
    

    C# 11.0 Interpolated raw string literal

    如果你想在這種格式插入 """ 字元的話,其語法就相當特殊,你必須插入 {"\"\"\""} 才行:

    string s9_1 = $"""
                {"\"\"\""}
                I think "{name}" are awesome!
                {"\"\"\""}
                """;
    s9_1.Dump("C# 11.0 Interpolated raw string literal - Multiline & Escape \"\"\"");
    

    要輸出 {} 大括弧符號且又想內插變數的話,就要改用 $$ 來改變對大括弧的解析方式,但之後若要內插變數就要改變語法,使用 {{name}} 這種方式內插變數!

    string s10 = $$"""
                I think "{name}" are awesome!
                I think "{{{name}}}" are awesome!
                """;
    s10.Dump("C# 11.0 Interpolated raw string literal - Multiline - Direct output { and }");
    

    有趣的地方是,如果你想用 {{{name}}} 來內插變數,可以使用 $$$ 來改變對大括弧的解析方式,以此類推下去,你的字串語法會變的非常詭異,哈!😆

    C# 11.0 Interpolated raw string literal

  • C# 11.0 UTF-8 string literals

    若要將一個 UTF-8 字串使用 ReadOnlySpan<byte> 來表達,在 C# 11.0 有個相當簡潔的語法,你可以直接在字串後面加上 u8 結尾,就可以指派給一個 ReadOnlySpan<byte> 型別的變數!

    ReadOnlySpan<byte> s11 = ("AUTH "u8);
    s11.Dump("C# 11.0 UTF-8 string literals");
    
    byte[] s11_byteArray = ("AUTH "u8).ToArray();
    s11_byteArray.Dump("C# 11.0 UTF-8 string literals to Byte Array");
    

    C# 11.0 UTF-8 string literals

相關連結

留言評論