C# プログラミングにおいて、文字列の扱いは避けては通れない非常に重要な要素です。
パスの指定、JSON の生成、SQL クエリの記述など、日常生活のコーディングの中で「特定の文字を文字列として正しく認識させたい」という場面は頻繁に登場します。
しかし、ダブルクォーテーションやバックスラッシュといった文字は、プログラミング言語にとって特別な意味を持つため、そのまま記述するとコンパイルエラーや意図しない挙動を招く原因となります。
そこで必要となるのが、「エスケープ」という概念です。
C# には、古くから使われているバックスラッシュを用いたエスケープシーケンスから、可読性を劇的に向上させる逐次指定文字列リテラル、そして最新の C# 11 で導入された生文字列リテラル (Raw String Literals) まで、多彩な表現手法が用意されています。
本記事では、これら C# におけるエスケープ手法のすべてを、具体的なコード例と共に詳しく解説します。
C# における文字列エスケープの基本
C# の文字列リテラルは、通常ダブルクォーテーション "" で囲んで記述します。
このとき、文字列の中で改行やタブ、あるいはダブルクォーテーション自体を文字として表現したい場合に、特定の記号を前置することでその文字の役割を打ち消す操作をエスケープと呼びます。
バックスラッシュを用いたエスケープシーケンス
C# で最も基本的なエスケープ方法は、バックスラッシュ (環境によっては円記号 ¥) を使用する方法です。
これをエスケープシーケンスと呼びます。
例えば、文字列の中でダブルクォーテーションを表示したい場合、そのまま記述すると文字列の終わりと誤認されてしまいます。
そこで、" と記述することで、それを「文字列の区切り」ではなく「文字としてのダブルクォーテーション」として扱うようコンパイラに指示します。
以下に、C# で頻繁に使用される主なエスケープシーケンスをまとめます。
| エスケープシーケンス | 意味 |
|---|---|
' | 単一引用符 (シングルクォーテーション) |
" | 二重引用符 (ダブルクォーテーション) |
\ | バックスラッシュ (円記号) |
\0 | Null 文字 |
\n | 改行 (Line Feed) |
\r | 復帰 (Carriage Return) |
\t | 水平タブ |
基本的なエスケープのコード例
実際にエスケープシーケンスを使用したプログラムを確認してみましょう。
using System;
class Program
{
static void Main()
{
// ダブルクォーテーションと改行、タブを含む文字列
string message = "C#のエスケープ解説:\n\t\"バックスラッシュ\"を使用します。";
// ファイルパスの記述 (バックスラッシュを2回書く必要がある)
string filePath = "C:\\Users\\Public\\Documents\\test.txt";
Console.WriteLine(message);
Console.WriteLine("ファイルパス: " + filePath);
}
}
C#のエスケープ解説:
"バックスラッシュ"を使用します。
ファイルパス: C:\Users\Public\Documents\test.txt
このように、通常の文字列リテラルでは、バックスラッシュ自体を表現するために \\ と 2 回重ねて書かなければならない点に注意が必要です。
これは Windows のファイルパスを扱う際などに記述が煩雑になる要因となります。
逐次指定文字列リテラル (@) によるエスケープの簡略化
ファイルパスや正規表現のように、バックスラッシュが頻出する文字列を扱う場合、前述のエスケープシーケンスでは可読性が著しく低下します。
これを解決するのが、逐次指定文字列リテラル (Verbatim String Literals) です。
文字列の先頭に @ 記号を付与することで、その文字列内ではバックスラッシュによるエスケープが無効化され、記述した通りに文字が認識されるようになります。
逐次指定文字列リテラルの特徴
- バックスラッシュをそのまま記述できる:ファイルパスなどを
\\とせずに記述可能です。 - 複数行にわたる記述が可能:文字列内で直接改行を行うことができます。
- ダブルクォーテーションのエスケープ方法が変わる:
""と 2 つ重ねることで、1 つのダブルクォーテーションとして認識されます。
逐次指定文字列リテラルのコード例
using System;
class Program
{
static void Main()
{
// @を付けることで、パスのバックスラッシュをそのまま書ける
string verbatimPath = @"C:\Users\Public\Documents\test.txt";
// 複数行の文字列もそのまま記述可能
string multiLine = @"これは
複数行にわたる
メッセージです。";
// ダブルクォーテーションは2つ重ねる
string quoteExample = @"彼は言った、""C#は素晴らしい""と。";
Console.WriteLine(verbatimPath);
Console.WriteLine(multiLine);
Console.WriteLine(quoteExample);
}
}
C: \Users\Public\Documents\test.txt
これは
複数行にわたる
メッセージです。
彼は言った、"C#は素晴らしい"と。
逐次指定文字列リテラルは非常に便利ですが、「文字列の最後にバックスラッシュを 1 つだけ置くことができない」という制約がある点には留意してください (最後の \" がエスケープと誤認されるのを防ぐための仕様上の名残です。ただし @ を使っている場合はそもそも \" 自体が「文字通り」扱われますが、終端判定に影響を及ぼす場合があります)。
文字列補間 ($) における特殊文字のエスケープ
C# 6.0 から導入された 文字列補間 (String Interpolation) は、文字列内に変数や式を直接埋め込める非常に強力な機能です。
文字列の先頭に $ を付け、{variable} の形式で記述します。
この文字列補間を使用する場合、波括弧 { } は特別な意味を持つため、文字として波括弧を表示したい場合には特別なエスケープが必要になります。
波括弧のエスケープ方法
文字列補間の中で { や } 自体を表示したい場合は、波括弧を 2 つ重ねて {{ または }} と記述します。
文字列補間のコード例
using System;
class Program
{
static void Main()
{
string name = "ユーザー";
int id = 12345;
// 変数の埋め込みと、波括弧自体のエスケープ
string info = $"ID: {id} の名前は {{ {name} }} です。";
Console.WriteLine(info);
}
}
ID: 12345 の名前は { ユーザー } です。
$ と @ の組み合わせ
C# 8.0 以降では、$@ または @$ と記述することで、文字列補間と逐次指定文字列リテラルの両方の機能を同時に利用できます。
これにより、「変数を埋め込みつつ、バックスラッシュのエスケープを不要にする」といった記述が可能になります。
C# 11 以降の標準:生文字列リテラル (Raw String Literals)
これまでのエスケープ手法でも多くの場面をカバーできましたが、JSON 形式の文字列や XML、SQL などをコード内に直接記述する際には、依然としてダブルクォーテーションのエスケープが面倒でした。
これを根本的に解決するために導入されたのが、C# 11 の「生文字列リテラル (Raw String Literals)」です。
生文字列リテラルは、少なくとも 3 つ以上のダブルクォーテーション """ で囲むことで定義されます。
生文字列リテラルの圧倒的なメリット
- エスケープが一切不要:ダブルクォーテーションもバックスラッシュも、そのまま記述できます。
- インデントの自動調整:終端の
"""の位置に基づいて、ソースコード上のインデントを自動的に削除してくれます。 - 柔軟なクォーテーション数:文字列内に
"""という連続した 3 つのダブルクォーテーションを含めたい場合は、囲み記号を 4 つ ("""") に増やすことで対応可能です。
生文字列リテラルのコード例 (JSON 記述の例)
using System;
class Program
{
static void Main()
{
// 3つのダブルクォーテーションで囲む
// インデントは終端の """ の位置に合わせて自動調整される
string json = """
{
"name": "Taro",
"age": 25,
"message": "Hello, \"C#\" world!"
}
""";
Console.WriteLine(json);
}
}
{
"name": "Taro",
"age": 25,
"message": "Hello, \"C#\" world!"
}
この例では、JSON 内部のダブルクォーテーションやバックスラッシュをエスケープすることなく、そのままの形で記述できていることが分かります。
生文字列リテラルと文字列補間の高度な組み合わせ
生文字列リテラルでも補間を利用できますが、文字列内に { } が含まれる JSON などを扱う場合、通常の $ 1 つでは波括弧が補間として認識されてしまい不便です。
生文字列リテラルでは、先頭に付ける $ の数によって、補間に必要な波括弧の数を指定できます。
例えば $$""" と書き始めた場合、{{variable}} と 2 つ重ねたときだけ値が埋め込まれ、1 つの { はただの文字として扱われます。
多重 $ 指定のコード例
using System;
class Program
{
static void Main()
{
string userName = "Alice";
// $$を使うことで、{{ }} が補間ターゲットになる
// これにより、JSON内の単一の { } をエスケープせずに済む
string complexJson = $$"""
{
"user": "{{userName}}",
"config": { "mode": "dark" }
}
""";
Console.WriteLine(complexJson);
}
}
{
"user": "Alice",
"config": { "mode": "dark" }
}
この機能は、「コードの見た目をそのまま出力結果に反映させたい」というニーズに対する究極の解決策と言えます。
Unicode や 16 進数によるエスケープ
特定の記号だけでなく、キーボードから直接入力しにくい文字や、バイナリ的な制御文字を扱う場合には、Unicode エスケープや 16 進数エスケープを使用します。
Unicode エスケープ (\u, \U)
16 進数のコードポイントを使用して文字を指定します。
\uXXXX:4 桁の 16 進数 (UTF-16)\UXXXXXXXX:8 桁の 16 進数 (サロゲートペア等を含む UTF-32)
16 進数エスケープ (\x)
\xXX:可変長の 16 進数で文字を表します。
Unicode エスケープのコード例
using System;
class Program
{
static void Main()
{
// Unicode文字 (著作権記号 © と 絵文字)
string copyright = "\u00A9 2024 Tech Column";
string emoji = "\U0001F600"; // Smiley face
Console.WriteLine(copyright);
Console.WriteLine("Emoji: " + emoji);
}
}
© 2024 Tech Column
Emoji: 😀
シチュエーション別:最適なエスケープ方法の選び方
多種多様なエスケープ方法があるため、どれを使うべきか迷うこともあるでしょう。
基本的には、「可読性が最も高くなるもの」を選択するのがベストプラクティスです。
1. 短い文字列や単純な改行
通常の文字列リテラルと \n や " を使用するのが手軽です。
例:"Error: \"Invalid input\""
2. Windows のファイルパス
逐次指定文字列リテラル @ を推奨します。
例:@"C:\Temp\Logs"
3. 正規表現 (Regex)
正規表現ではバックスラッシュを多用するため、逐次指定文字列リテラル @ が必須レベルで便利です。
例:@"\d{3}-\d{4}"
4. JSON、XML、SQL クエリ
生文字列リテラル """ を強く推奨します。
二重引用符のエスケープから解放され、インデントも維持できるため、保守性が劇的に向上します。
5. 変数を埋め込みたい場合
文字列補間 $ を使用します。
複雑な構造なら $$""" との併用を検討しましょう。
まとめ
C# における文字列エスケープは、言語の進化とともに驚くほど使いやすく進化してきました。
- 基本のエスケープシーケンス (
\) は、すべての基礎であり、短い特殊文字の挿入に適しています。 - 逐次指定文字列リテラル (
@) は、パス指定や複数行テキストにおいて今でも現役の便利な機能です。 - 文字列補間 (
$) は、波括弧を{{ }}と重ねるエスケープルールさえ覚えれば、最も多用する機能となります。 - 生文字列リテラル (
""") は、現代の C# 開発において、外部フォーマット (JSON 等) を扱う際のデファクトスタンダードです。
これらの手法を適切に使い分けることで、エスケープシーケンスだらけの読みにくいコードを卒業し、「意図が明確でメンテナンスしやすいコード」を記述できるようになります。
最新の C# 機能を積極的に取り入れ、よりクリーンな文字列操作を実現しましょう。






