我昨天在整理 C# 到底有多少字串的表示法,原本想說應該五六個吧,整理到越後面越多,整理出了 11
種不同的語法,真的到了讓人眼花撩亂的地步。今天這篇文章就我就整理一下我的研究心得。
我從 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 Verbatim string literals
你可以直接在字串中加入「斷行符號」且不需要用 \r\n
跳脫字元,但雙引號要改用 ""
才行!
string s2 = @"I think
""" + name + @"""
are awesome!";
s2.Dump("C# 1.0 Verbatim string literals - @\"\" - Multiline");
-
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# 8.0 Interpolated Verbatim Strings
你可以使用 @$"..."
或 $@"..."
語法,混合 Verbatim string literals
與 Interpolated 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# 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# 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# 字串中寫上 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");
如果你想在這種格式插入 """
字元的話,其語法就相當特殊,你必須插入 {"\"\"\""}
才行:
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 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");
相關連結