C#における文字列記述の課題
C#で文字列リテラルを扱う際、特定の文字は「エスケープシーケンス」を用いて表現する必要があります。例えば、バックスラッシュ(\)は\\と2回続けなければならず、改行は\nと記述します。
特にWindowsのファイルパスや、複数行にわたる長いテキストを扱う場合、これらのエスケープシーケンスが多用され、コードの可読性が低下する原因となることがあります。
この問題を解決するために、C#には「逐語的リテラル文字列(Verbatim String Literal)」という便利な記法が用意されています。
逐語的リテラル文字列(@)とは
逐語的リテラル文字列は、文字列リテラルの先頭にアットマーク(@)を付けることで機能します。
@を付けた文字列リテラルは、主に2つの大きな特徴を持ちます。
- エスケープシーケンスが無効になる:
\nや\t、\\といったエスケープシーケンスが解釈されず、\は単なるバックスラッシュ文字として扱われます。 - 改行がそのまま認識される: リテラル内の改行(Enterキーによる改行)が、そのまま文字列データとしての改行として扱われます。
利点1: ファイルパスとエスケープの簡略化
逐語的リテラルが最も役立つ場面の一つが、Windowsのファイルパスの扱いです。
通常の文字列リテラルでは、パス区切り文字である\をすべて\\とエスケープする必要があります。
using System;
public class PathExample
{
public static void Main()
{
// 通常の文字列リテラルの場合
string configPathRegular = "C:\\Application\\Settings\\default.xml";
// 逐語的リテラル文字列の場合
string configPathVerbatim = @"C:\Application\Settings\default.xml";
Console.WriteLine("通常: " + configPathRegular);
Console.WriteLine("逐語的: " + configPathVerbatim);
// 両者はまったく同じ文字列データになります
bool areEqual = (configPathRegular == configPathVerbatim);
Console.WriteLine("内容は同じか: " + areEqual);
}
}
出力結果:
通常: C:\Application\Settings\default.xml
逐語的: C:\Application\Settings\default.xml
内容は同じか: True
@を使用することで、パスをコピー&ペーストした際にも修正が不要となり、コードが非常にすっきりと読みやすくなります。
利点2: 複数行のテキストをそのまま記述
プログラムコード内にSQLクエリや、長いテンプレートメッセージを埋め込む際、複数行にわたるテキストを扱いたい場合があります。
@を使用すると、エディタ上での見たままの改行が文字列に反映されます。
using System;
public class MultiLineExample
{
public static void Main()
{
// 例: 複数行にわたるSQLクエリ
string sqlQuery = @"
SELECT
UserID,
UserName,
LastLogin
FROM
Users
WHERE
IsActive = 1
ORDER BY
LastLogin DESC;
";
Console.WriteLine("--- 実行クエリ ---");
Console.WriteLine(sqlQuery);
}
}
出力結果:
--- 実行クエリ ---
SELECT
UserID,
UserName,
LastLogin
FROM
Users
WHERE
IsActive = 1
ORDER BY
LastLogin DESC;
\nや文字列の連結(+)を使う必要がなく、直感的に複数行のテキストを定義できます。
逐語的リテラル内の例外ルール
逐語的リテラルでは、ほぼすべてのエスケープシーケンスが無効になりますが、唯一の例外があります。
それは「ダブルクォーテーション(")」です。
逐語的リテラル文字列の開始と終了は"で示されるため、文字列の「中身」として"を含めたい場合は、""と2回連続で記述します。
using System;
public class QuoteExample
{
public static void Main()
{
// "C:\Program Files\" フォルダという文字列を表現したい
// "" で " をエスケープする
string directoryPath = @"C:\Program Files\";
string message = $@"インストール先は ""{directoryPath}"" フォルダです。";
Console.WriteLine(message);
}
}
出力結果:
インストール先は "C:\Program Files\" フォルダです。
補足: 文字列補間との組み合わせ($@)
逐語的リテラルは、変数の値を埋め込む「文字列補間($)」と組み合わせて使用することもできます。
$@(または@$)と記述することで、複数行のテキストに変数を簡単に埋め込むことが可能になります。
using System;
public class InterpolationExample
{
public static void Main()
{
string userName = "SalesTeam";
string serverName = "DB-SERVER-01";
// $@ を使用して、複数行の接続文字列を生成
string connectionString = $@"
Data Source={serverName};
Initial Catalog=ProductionDB;
User ID={userName};
Password=SecurePassword123;
";
Console.WriteLine("--- 生成された接続文字列 ---");
Console.WriteLine(connectionString);
}
}
まとめ
逐語的リテラル文字列(@)は、C#において文字列を扱う際の可読性を大幅に向上させる機能です。
- ファイルパスや正規表現など、
\を多用する文字列を扱う場合 - SQL文やテンプレートなど、複数行にわたるテキストをコード内に記述する場合
上記のような場面で活用することで、よりクリーンで保守しやすいコードを記述できます。
