C#を用いてアプリケーションを開発する際、文字列の中にダブルクォーテーションを含めたい場面は多々あります。
例えば、JSONデータの生成、SQLクエリの構築、あるいは単純にユーザーへのメッセージとして引用符を表示したい場合などです。
しかし、C#においてダブルクォーテーションは文字列リテラルの開始と終了を示す特別な意味を持つため、そのまま記述するとコンパイルエラーが発生してしまいます。
本記事では、C#でダブルクォーテーションを正しくエスケープするための基本的な手法から、C# 11で導入された非常に便利な「生文字列リテラル」まで、エンジニアが実務で直面する課題を解決するための知識を網羅的に解説します。
最新の文法をマスターすることで、コードの可読性を劇的に向上させ、バグの混入を防ぐことが可能になります。
C#における文字列とダブルクォーテーションの基本
C#のプログラムにおいて、文字列(string型)を定義する際は、ダブルクォーテーション "" で囲むのが基本ルールです。
string message = "Hello, World!";
このとき、message という変数の中に「”Hello”」という風に、ダブルクォーテーション自体を含めたいと考えたとします。
もし以下のように記述すると、コンパイラは最初の2つのダブルクォーテーションを文字列のペアと解釈し、その後の文字を不正なコードとして認識してしまいます。
// コンパイルエラーになる例
string errorText = "He said, "Hello".";
このような問題を解決するために、C#にはいくつかの「エスケープ」手法が用意されています。
歴史的な経緯を含め、順を追って見ていきましょう。
手法1:バックスラッシュによるエスケープシーケンス
最も古くから使われており、多くのプログラミング言語(C、C++、Java、JavaScriptなど)と共通しているのが、エスケープシーケンスを使用する方法です。
バックスラッシュ(\)の役割
C#では、文字列内でバックスラッシュ(環境によっては円記号)を直前に置くことで、その後に続く文字に特別な意味を持たせることができます。
ダブルクォーテーションを文字として扱いたい場合は、" と記述します。
using System;
public class Program
{
public static void Main()
{
// ダブルクォーテーションをエスケープして表示
string speech = "He said, \"Hello, C#!\"";
Console.WriteLine(speech);
}
}
He said, "Hello, C#!"
特徴と注意点
この手法は非常にシンプルで、短い文字列であれば直感的に理解できます。
しかし、ダブルクォーテーションが頻出する文字列(例えば複雑なHTMLタグやJSONなど)を扱う場合、コードが非常に読みづらくなるという欠点があります。
| エスケープ対象 | 記述方法 | 意味 |
|---|---|---|
| ダブルクォーテーション | \" | 文字としての ” を挿入 |
| バックスラッシュ | \\ | 文字としての \ を挿入 |
| 改行 | \n | 改行コードを挿入 |
例えば、JSONをこの方法で記述しようとすると、以下のようになり視認性が極端に低下します。
// 読みづらい例
string json = "{\"name\": \"Taro\", \"age\": 25}";
このような「エスケープの嵐」を避けるために、次の手法が活用されます。
手法2:逐次リテラル(逐語的文字列リテラル)の使用
C# 2.0から利用可能な逐次リテラル(Verbatim String Literals)は、文字列の先頭に @ 記号を付ける手法です。
逐次リテラルでのダブルクォーテーション
逐次リテラル内では、エスケープシーケンス(\nなど)が無効化され、記述した通りに改行や空白が保持されます。
ただし、ダブルクォーテーションだけは例外で、2つ続けて記述する(””)ことで、1つのダブルクォーテーションとして解釈されます。
using System;
public class Program
{
public static void Main()
{
// @を使用した逐次リテラル
string path = @"C:\Users\Documents\ ""Sample"" .txt";
string multiLine = @"これは
""ダブルクォーテーション"" を含む
複数行の文字列です。";
Console.WriteLine(path);
Console.WriteLine(multiLine);
}
}
C:\Users\Documents\ "Sample" .txt
これは
"ダブルクォーテーション" を含む
複数行の文字列です。
逐次リテラルのメリット
逐次リテラルの最大のメリットは、ファイルパスの記述が楽になる点です。
通常のリテラルでは \ と書かなければならないバックスラッシュを、そのまま \ と記述できるため、Windowsのディレクトリ構造を扱う際に重宝します。
ダブルクォーテーションについても、" よりは "" の方が視覚的に「引用符である」ことが分かりやすいケースもあります。
しかし、JSONのように「キー」と「値」の両方を囲む必要がある形式では、依然として記述量が多くなるという課題が残っていました。
手法3:C# 11以降の決定版「生文字列リテラル」
C# 11において、文字列の扱いに関する歴史的なアップデートが行われました。
それが生文字列リテラル(Raw String Literals)です。
これは、モダンなプログラミング言語(PythonやKotlinなど)に見られるような、より柔軟な文字列定義の手法です。
基本的な使い方
生文字列リテラルは、"""(3つ以上のダブルクォーテーション)で文字列を囲みます。
この中では、ダブルクォーテーションもバックスラッシュもエスケープなしでそのまま記述可能です。
using System;
public class Program
{
public static void Main()
{
// C# 11 生文字列リテラル
string raw = """
{
"name": "Taro",
"age": 25,
"message": "He said, \"Hello\"."
}
""";
Console.WriteLine(raw);
}
}
{
"name": "Taro",
"age": 25,
"message": "He said, \"Hello\"."
}
4つ以上のクォートを含めたい場合
もし文字列の内容自体に """ という連続した3つのクォートを含めたい場合は、囲み記号の数をさらに増やします。
例えば、""""(4つ)で囲めば、その内部では3つまでの連続したダブルクォーテーションを文字として扱えます。
ルールは単純で、「開始/終了の記号よりも少ない数の連続クォートなら何でも書ける」というものです。
インデントの自動調整機能
生文字列リテラルには、コードの見た目を整えるための非常に優れた機能があります。
終了記号(最後の """)の位置に基づいて、各行の先頭の空白(インデント)が自動的に削除されるのです。
これにより、コード内のインデントを維持したまま、出力結果からは不要な空白を取り除くことができます。
これはSQLクエリなどをソースコード内に埋め込む際に非常に重宝します。
文字列補間($)との組み合わせ
C#では、変数の中身を文字列に埋め込む「文字列補間(Interpolated Strings)」がよく使われます。
これらとエスケープを組み合わせる方法を整理しましょう。
従来の文字列補間とエスケープ
$"" を使う場合、ダブルクォーテーションを含めるには手法1と同様に " を使用します。
string name = "Alice";
string greet = $"Hello, \"{name}\"!"; // Hello, "Alice"!
生補間文字列リテラル($”””)
C# 11では、$ と """ を組み合わせることができます。
これが現在のC#において最も強力な文字列操作手法です。
string category = "Books";
int price = 1500;
// $ と """ の組み合わせ
string json = $"""
{
"item": {
"category": "{category}",
"price": {price}
}
}
""";
もし、文字列の中に波括弧 {} 自体を含めたい場合(例えばJSONやAngularのテンプレートなど)は、$$""" のように $ を2つ重ねることで、変数の埋め込みを {{variable}} という形式に変更でき、単一の波括弧を文字として扱えるようになります。
Unicodeエスケープシーケンスによる指定
稀なケースですが、ソースコード上に直接ダブルクォーテーションの文字を記述したくない、あるいは特殊な文字コードとして扱いたい場合には、Unicodeエスケープを使用することも可能です。
ダブルクォーテーションのUnicode番号は U+0022 です。
// Unicodeエスケープを使用
string unicodeQuote = "This is a \u0022quote\u0022.";
Console.WriteLine(unicodeQuote); // This is a "quote".
この方法は可読性が低いため、通常は推奨されませんが、文字コードを意識する必要がある低レイヤーの処理などで利用されることがあります。
実践比較:どの手法を選ぶべきか?
ここまで紹介した手法を、用途別に比較してみましょう。
| 手法 | 記法 | 主な用途 | 推奨される場面 |
|---|---|---|---|
| エスケープシーケンス | \" | 短い文字列 | 1〜2箇所だけ引用符を入れたい時 |
| 逐次リテラル | @"" | パス、複数行 | Windowsのファイルパスを扱う時 |
| 生文字列リテラル | """ | JSON, XML, SQL | 構造化データや複雑な文字列を扱う時 |
JSON文字列を作成する場合の比較
以下の表は、同じJSON文字列を作成する際のコードの簡潔さを比較したものです。
通常のリテラル:
"{"id": 1}"(バックスラッシュが多く煩雑)
逐次リテラル:
@"{""id"": 1}"(ダブルクォーテーションの連続が不自然)
生文字列リテラル:
"""{"id": 1}"""(最も自然でコピー&ペーストもしやすい)
現在の開発環境が .NET 7 / C# 11 以降を利用できるのであれば、基本的には「生文字列リテラル」を選択するのがベストプラクティスと言えます。
まとめ
C#でダブルクォーテーションをエスケープする手法は、言語の進化とともに洗練されてきました。
- エスケープシーケンス(”):基本中の基本。短い文字列に最適。
- 逐次リテラル(@””):ファイルパスや、C# 10以前の環境での複数行文字列に便利。
- 生文字列リテラル(””” “””):C# 11からの決定版。JSONやSQLなど、引用符が頻出するデータに最適。
開発現場では、古いバージョンのC#で書かれたコードをメンテナンスすることもあれば、最新の機能を使って新規開発することもあります。
それぞれの特性を理解し、「コードの読みやすさ(可読性)」と「保守のしやすさ」を基準に最適な手法を選択することが重要です。
特に生文字列リテラルは、外部ファイルのテンプレートをコード内に貼り付ける際のストレスを大幅に軽減してくれます。
ぜひ今日からのプログラミングに取り入れてみてください。






