$と@の併用
C#には、文字列を扱う上で非常に強力な2つの機能があります。
- 文字列補間(
$):$"Name: {userName}"のように、文字列内に{}を使って変数を直接埋め込む機能。 - 逐語的リテラル(
@):@"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クエリやテンプレートなど、複数行にわたる文字列
上記のような文字列に対して、{} を使った変数の埋め込みを安全かつ可読性高く行いたい場合に、$@構文は最適な解決策となります。
