C#の逐語的リテラル文字列(@)の使い方とメリット:ファイルパスや複数行テキストを簡単に

目次

C#における文字列記述の課題

C#で文字列リテラルを扱う際、特定の文字は「エスケープシーケンス」を用いて表現する必要があります。例えば、バックスラッシュ(\)は\\と2回続けなければならず、改行は\nと記述します。

特にWindowsのファイルパスや、複数行にわたる長いテキストを扱う場合、これらのエスケープシーケンスが多用され、コードの可読性が低下する原因となることがあります。

この問題を解決するために、C#には「逐語的リテラル文字列(Verbatim String Literal)」という便利な記法が用意されています。


逐語的リテラル文字列(@)とは

逐語的リテラル文字列は、文字列リテラルの先頭にアットマーク(@)を付けることで機能します。

@を付けた文字列リテラルは、主に2つの大きな特徴を持ちます。

  1. エスケープシーケンスが無効になる: \n\t\\といったエスケープシーケンスが解釈されず、\は単なるバックスラッシュ文字として扱われます。
  2. 改行がそのまま認識される: リテラル内の改行(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文やテンプレートなど、複数行にわたるテキストをコード内に記述する場合

上記のような場面で活用することで、よりクリーンで保守しやすいコードを記述できます。

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

この記事を書いた人

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

目次