rksoftware

Visual Studio とか C# とかが好きです

C# 11 の新機能を確認「 未加工の文字リテラル 」

C# 11 の新機能を確認しています。目次は次の記事です。
rksoftware.hatenablog.com

今回は 「 未加工の文字リテラル 」。公式 Learn の記事は次です。
機能を表す言葉が 未加工の文字リテラル で機能名が 生文字列リテラル のようです。両方の言葉を覚えておきましょう。

learn.microsoft.com

改行やエスケープが必要な文字列をそのまま書けます。

■ 確認

次のようなコードが書けます。

var ramen = """
    "手打ち風" ラーメン
    \550-
    """;
Console.WriteLine(ramen);
// "手作り風" ラーメン
// \550-

以前は次のように書いていたので、かなり良いと思います。

var ramen = @"""手打ち風"" ラーメン
\\550-
";
Console.WriteLine(ramen);

ちなみに前者のコードは .NET 6 を指定した場合は次のエラーになります。

エラー CS8936 機能 '生文字列リテラル' は C# 10.0 では使用できません。言語バージョン 11.0 以上を使用してください。

■ """

""" の行で初めて """ の行で終わると今回の 生文字列リテラル が使えます。
しかし、""" が使いたいときはどうでしょう? 開始と終了の行の " を増やせば行けます。

var ramen = """"
    """手打ち風""" ラーメン
    \550-
    """";
Console.WriteLine(ramen);
// """手作り風""" ラーメン
// \550-

"""" が使いたい場合はさらに増やします。

var ramen = """""
    """"手打ち風"""" ラーメン
    \550-
    """"";
Console.WriteLine(ramen);
// """"手作り風"""" ラーメン
// \550-

■ その他の細かいルール

"""" は開始と終了に 1 行使って入力します。次のコードはエラーになってしまいます。

var ramenA = """手打ち風 ラーメン \550-
    """;

var ramenB = """
    手打ち風 ラーメン \550-""";

終了の """" が文字列の行ごとの開始位置になります。次の例では終了の """" が行の先頭にあって、文字列は左に空白があります。そのため文字列としてはスペースで始まる文字列になっています。

var ramen = """
    手打ち風 ラーメン
    \550-
""";
Console.WriteLine(ramen);
//     """"手作り風"""" ラーメン
//     \550-

終了の """" より先頭の空白が少ない行がある場合はエラーになります。

var ramen = """
    手打ち風 ラーメン
    \550-
         """;
エラー CS8999 行の先頭が生文字列リテラルの終了行と同じ空白ではありません。

■ 必要な時、自然に書くと思います

この新機能はかなり使いやすいです。覚えておきましょう。細かいことは特に覚えておかなくても普通に書けると思います。大丈夫です。安心してください。