【C#】文字列補間と逐語的リテラルの組み合わせ:$@構文でエスケープを無効化

目次

$@の併用

C#には、文字列を扱う上で非常に強力な2つの機能があります。

  1. 文字列補間($: $"Name: {userName}" のように、文字列内に {} を使って変数を直接埋め込む機能。
  2. 逐語的リテラル(@: @"C:\Folder" のように、文字列内の \(バックスラッシュ)をエスケープ文字として扱わず、そのままの文字として認識させる機能。また、改行もそのまま反映されます。

課題:ファイルパスと変数

ここで問題になるのが、「ファイルパスのように \ を多用し、かつ、変数も埋め込みたい」場合です。

文字列補間($)だけを使うと、\ をすべて \\ とエスケープする必要があり、非常に読みにくくなります。

string userId = "user_001";

// '$' だけの場合、'\' はすべて '\\' にエスケープする必要がある
string logPathEscaped = $"C:\\Logs\\{userId}\\session.log"; 
// 出力: C:\Logs\user_001\session.log

解決策:$@構文(または@$

C#では、この2つの記号を組み合わせて $@ (または C# 8.0以降は @$)と記述することで、「逐語的リテラルの特性(エスケープ無効化)を持ちながら、文字列補間(変数埋め込み)も行う」ことができます。

これにより、ファイルパスのような文字列を、\ をエスケープすることなく直感的に構築できます。

コード例1:ファイルパスの構築

$@ を使用すると、\ をそのまま記述できるため、パスの可読性が大幅に向上します。

using System;

public class InterpolatedVerbatimExample
{
    public static void Main()
    {
        string userId = "user_001";
        string environment = "Production";

        // '$@' を使用
        // '\' をエスケープする必要がなく、'{userId}' は変数として展開される
        string logPath = $@"C:\{environment}\Logs\{userId}\session.log";

        Console.WriteLine("--- $@ の使用例 ---");
        Console.WriteLine(logPath);
        
        // C# 8.0以降は '@$' の順序も可能
        string logPathAtDollar = @$"C:\{environment}\Logs\{userId}\session.log";
        Console.WriteLine(logPathAtDollar);
    }
}

出力結果:

--- $@ の使用例 ---
C:\Production\Logs\user_001\session.log
C:\Production\Logs\user_001\session.log

応用:複数行テキストと変数の組み合わせ

@(逐語的リテラル)のもう一つの利点は、複数行のテキストをそのまま記述できることです。$@構文は、この利点も引き継ぎます。

複数行のSQLクエリや設定テキストに、動的に変数を埋め込む際に非常に有効です。

コード例2:複数行のSQLクエリ

using System;

public class MultiLineInterpolationExample
{
    public static void Main()
    {
        string targetTable = "Employees";
        int statusFilter = 1; // 有効なユーザー

        // $@ を使用して、複数行のSQLに変数を埋め込む
        string sqlQuery = $@"
SELECT
    EmployeeID,
    FullName,
    Email
FROM
    {targetTable}
WHERE
    IsActive = {statusFilter}
ORDER BY
    FullName;
";
        Console.WriteLine("--- 複数行の例 ---");
        Console.WriteLine(sqlQuery);
    }
}

出力結果:

--- 複数行の例 ---

SELECT
    EmployeeID,
    FullName,
    Email
FROM
    Employees
WHERE
    IsActive = 1
ORDER BY
    FullName;


注意点:波括弧 {} 自体のエスケープ

$@構文では、{} は変数を埋め込むための特別な記号として扱われます。

もし、JSON文字列など、{} の文字自体を文字列に含めたい場合は、それらを2重に({{}})記述する必要があります。

using System;

public class BraceEscapeExample
{
    public static void Main()
    {
        string settingName = "DefaultConnection";
        
        // JSON で { と } を表現するために {{ と }} を使う
        string jsonOutput = $@"
{{
    ""SettingName"": ""{settingName}"",
    ""Timeout"": 30
}}
";
        Console.WriteLine("--- 波括弧のエスケープ ---");
        Console.WriteLine(jsonOutput);
    }
}

出力結果:

--- 波括弧のエスケープ ---

{
    "SettingName": "DefaultConnection",
    "Timeout": 30
}


まとめ

$@(または@$)構文は、C#における文字列操作を非常に強力にする機能です。

  • ファイルパス正規表現など、\ を多用する文字列
  • SQLクエリテンプレートなど、複数行にわたる文字列

上記のような文字列に対して、{} を使った変数の埋め込みを安全かつ可読性高く行いたい場合に、$@構文は最適な解決策となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次