rksoftware

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

C# 11 の新機能を確認「文字列補間式の改行」

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

今回は 「 文字列補間式の改行 」。公式 Learn の記事は次です。
記事中の「 C# 11 以降では、補間される式に改行を含めることができます。 」から始まる部分が今回の新機能です。

learn.microsoft.com

文字列補間式の中で改行ができます。また、文字列補間式は C# 11 の新機能「生文字リテラル ( C# 11 での新機能の説明では「未加工の文字リテラル」)」と同時に使用することもできます。

■ 確認

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

var prefectures = new[] { "埼玉", "東京" };

foreach (var prefecture in prefectures)
    Console.WriteLine(
        $"{prefecture}{
            prefecture switch
            {
                "埼玉" => "最高",
                _ => "もっとがんばりましょう"
            }
        } です。"
    );

// 埼玉 は 最高 です。
// 東京 は もっとがんばりましょう です。

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

var prefectures = new[] { "埼玉", "東京" };

foreach (var prefecture in prefectures)
    Console.WriteLine(
        $"{prefecture}{prefecture switch { "埼玉" => "最高", _ => "もっとがんばりましょう" }}です。"
        );

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

エラー CS8967 非逐語的な補間された文字列内の改行は、C# 10.0 ではサポートされていません。11.0 またはそれ以上の言語バージョンを使用してください。

■ 生文字リテラルとの組み合わせ

生文字リテラルとの組み合わせはこんな感じになります。

var prefectures = new[] { "埼玉", "東京" };

foreach (var prefecture in prefectures)
    Console.WriteLine(
        $$"""
        "{ {{prefecture}} } は { {{
            prefecture switch
            {
                "埼玉" => "最高",
                _ => "もっとがんばりましょう"
            }
        }} } です。
        """
    );

// { 埼玉 } は { 最高 } です。
// { 東京 } は { もっとがんばりましょう } です。

{ や } を含む文字列が作りやすくなります。
ちなみにこのコードを .NET 6 指定では次のエラーです。

エラー CS8967 非逐語的な補間された文字列内の改行は、C# 10.0 ではサポートされていません。11.0 またはそれ以上の言語バージョンを使用してください。
エラー CS8936 機能 '生文字列リテラル' は C# 10.0 では使用できません。言語バージョン 11.0 以上を使用してください。

もし {{ や }} を文字列内で使いたい場合も大丈夫です。 $ を増やせば大丈夫です。

var prefectures = new[] { "埼玉", "東京" };

foreach (var prefecture in prefectures)
    Console.WriteLine(
        $$$"""
        "{{ {{{prefecture}}} }} は {{ {{{
            prefecture switch
            {
                "埼玉" => "最高",
                _ => "もっとがんばりましょう"
            }
        }}} }} です。
        """
    );

// {{ 埼玉 }} は {{ 最高 }} です。
// {{ 東京 }} は {{ もっとがんばりましょう }} です。

さらに増やしたい場合は、さらに $ を追加です。

var prefectures = new[] { "埼玉", "東京" };

foreach (var prefecture in prefectures)
    Console.WriteLine(
        $$$$"""
        "{{{ {{{{prefecture}}}} }}} は {{{ {{{{
            prefecture switch
            {
                "埼玉" => "最高",
                _ => "もっとがんばりましょう"
            }
        }}}} }}} です。
        """
    );

// {{{ 埼玉 }}} は {{{ 最高 }}} です。
// {{{ 東京 }}} は {{{ もっとがんばりましょう }}} です。

こういう力強い言語仕様、大好きです!

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

この新機能は覚えておかなくても、必要な場面では自然に書いているとおもいます。大丈夫です。安心してください。