3つ以上のダブルクォートで囲むものを生文字列リテラルとする
@"" と $"" が合体したような機能ですかねぇ
Console.WriteLine("""生文字列リテラル""");
Console.WriteLine(""""これも生文字列リテラル"""");
\によるエスケープシーケンスは無効
Console.WriteLine("abc\ndef");
Console.WriteLine("""abc\ndef""");
実行結果
abc
def
abc\ndef
これは逐次的文字列リテラル(@"")と同じです
変数埋め込み
C#6.0から変数が埋め込めるようになりました
それのバージョンアップ版ですね
var x = 10;
// 生文字列リテラル
Console.WriteLine($"""x = {x}""");
Console.WriteLine($$"""x = {{x}}""");
// 変数埋め込み(C#6.0)
Console.WriteLine($"x = {x}");
開始のダブルクォートの前に$を何個記載するかに応じて{}の数が決まるようになっています
なかなか使う機会はないかもしれないですが・・・
以下のようなことができます
var x = 10;
// 生文字列リテラル
Console.WriteLine($$"""{x} = {{x}}"""); // {x} = 10
// 変数埋め込み(C#6.0)で同じことをするなら
Console.WriteLine($"{{x}} = {x}"); // {x} = 10
変数埋め込みだと { }が特別な文字なのでエスケープするためには、同じ文字で続けて書く必要がありました
生文字列リテラルの場合は、ダブルクォートの前の$の数で調整できるので、 {} をリテラルとして使いたい場合は、
$の数を調整すればよいので、直感的に記載ができるということになります
開始直後、終了直前の改行は無視。各行の前後空白は無視。
var str = """"
abc
def
ghi
"""";
Console.WriteLine($"文字数:{str.Length}");
Console.WriteLine(str);
文字数:13
abc
def
ghi
13文字なので、各文字列の間にCRLFの2文字("abc\r\ndef\r\nghi")があるので
3文字(abc) + 2文字(\r\n) + 3文字(def) + 2文字(\r\n) + 3文字(ghi) 計13文字になります