文字列補間 $"..."(C#)
『C#』の $"..."(文字列補間)を使うと、文字列の中に変数や式を {} で埋め込めます。従来の string.Format() や + による文字列結合よりも読みやすく、書式指定や条件式もそのまま埋め込めます。@"..."(逐語的文字列)との組み合わせや、C# 11 で追加された raw string literal についても紹介します。
構文
// $ を付けた文字列の中で { } に変数や式を埋め込みます。
$"テキスト {変数} テキスト"
// 書式指定は : のあとに書きます(string.Format の書式と同じです)。
$"{変数:書式指定}"
// 条件式(三項演算子)もそのまま書けます。
$"{条件式 ? 真の値 : 偽の値}"
// @ と $ を組み合わせると逐語的文字列補間になります(バックスラッシュがエスケープされません)。
$@"パス: {変数}\フォルダ"
// または(C# 8.0 以降は順序を逆にしても同じです)
@$"パス: {変数}\フォルダ"
// C# 11 のraw string literal(""" で囲む)でも補間できます。
// $""" の形で使い、{ } の個数で埋め込みの深さを指定します。
$"""
テキスト {変数} テキスト
"""
書式指定一覧
| 書式 | 概要 | 例(値: 12345.6789) |
|---|---|---|
| :F2 | 小数点以下2桁の固定小数点数 | 12345.68 |
| :N0 | 3桁区切りの整数 | 12,346 |
| :N2 | 3桁区切り・小数点以下2桁 | 12,345.68 |
| :E2 | 指数表記・小数点以下2桁 | 1.23E+004 |
| :P1 | パーセント表示・小数点以下1桁(値: 0.856) | 85.6% |
| :D5 | 整数を最低5桁にゼロ埋め(値: 42) | 00042 |
| :X | 16進数(大文字)(値: 255) | FF |
| :yyyy/MM/dd | 日付の書式(DateTime 型) | 2026/03/27 |
サンプルコード
StringInterpolationBasic.cs
using System;
class StringInterpolationBasic {
static void Main() {
// --- 基本的な変数の埋め込み ---
// $ を付けた文字列の中で { } に変数を書くだけで埋め込めます。
string name = "item_x";
int score = 850;
string category = "type_A";
// 従来の + 結合です(読みにくくなりがちです)。
string old = "名前: " + name + "、スコア: " + score + "、カテゴリ: " + category;
// 文字列補間を使うと一目でわかりやすくなります。
string msg = $"名前: {name}、スコア: {score}、カテゴリ: {category}";
Console.WriteLine(old);
Console.WriteLine(msg);
// --- { } の中で計算式を書けます ---
int baseScore = 850;
int multiplier = 50;
// 変数だけでなく四則演算もそのまま埋め込めます。
Console.WriteLine($"合計スコア: {baseScore * multiplier:N0}");
// --- 書式指定(: のあとに書式を書きます)---
double damageRate = 0.856;
double totalDmg = 123456.789;
// :P1 はパーセント表示(小数点以下1桁)です。
Console.WriteLine($"命中率: {damageRate:P1}");
// :F2 は小数点以下2桁の固定小数点数です。
Console.WriteLine($"総ダメージ: {totalDmg:F2}");
// :N0 は3桁区切りの整数です。
Console.WriteLine($"総ダメージ(区切り): {totalDmg:N0}");
}
}
コンパイルして実行すると次のようになります。
dotnet script StringInterpolationBasic.cs 名前: item_x、スコア: 850、カテゴリ: type_A 名前: item_x、スコア: 850、カテゴリ: type_A 合計スコア: 42,500 命中率: 85.6 % 総ダメージ: 123456.79 総ダメージ(区切り): 123,457
StringInterpolationExpression.cs
using System;
using System.Collections.Generic;
class StringInterpolationExpression {
static void Main() {
// --- { } の中に条件式(三項演算子)を埋め込みます ---
// 長くなる場合は変数に切り出す方が読みやすいですが、短い条件なら直接書けます。
int score = 850;
Console.WriteLine($"判定: {(score >= 800 ? "合格" : "不合格")}");
// --- メソッド呼び出しも埋め込めます ---
string name = " item_x ";
// Trim() や ToUpper() などのメソッドを { } の中で直接呼び出せます。
Console.WriteLine($"名前(前後スペース除去): {name.Trim()}");
Console.WriteLine($"名前(大文字): {name.Trim().ToUpper()}");
// --- プロパティへのアクセスも直接書けます ---
var items = new List<string> { "item_a", "item_b", "item_c", "item_d", "item_e" };
// .Count プロパティを { } の中から参照します。
Console.WriteLine($"要素数: {items.Count}個");
// インデクサも使えます。
Console.WriteLine($"先頭の要素: {items[0]}");
// --- 複数の書式を組み合わせた例 ---
// ステータス表示のように、複数の値を整形して出力します。
string target = "item_b";
int current = 42000;
int max = 50000;
double rate = (double)current / max;
// :N0 で3桁区切り、:P1 でパーセント表示、:D5 でゼロ埋めを使います。
Console.WriteLine($"[{target}] 値: {current:N0} / {max:N0}({rate:P1})");
Console.WriteLine($"シリアルNo: {42:D5}");
}
}
コンパイルして実行すると次のようになります。
dotnet script StringInterpolationExpression.cs 判定: 合格 名前(前後スペース除去): item_x 名前(大文字): ITEM_X 要素数: 5個 先頭の要素: item_a [item_b] 値: 42,000 / 50,000(84.0 %) シリアルNo: 00042
StringInterpolationVerbatim.cs
using System;
class StringInterpolationVerbatim {
static void Main() {
// --- @"..." 逐語的文字列との組み合わせ ---
// 通常の文字列ではバックスラッシュをエスケープする必要があります。
string name = "item_x";
// 通常: \\ と書かないとパスが正しく表示されません。
string pathNormal = "C:\\Users\\" + name + "\\SaveData\\data.dat";
Console.WriteLine(pathNormal);
// $@ を組み合わせると \\ を \ のまま書けます(逐語的文字列補間)。
// C# 8.0 以降は $@ と @$ のどちらの順序でも同じ意味になります。
string pathVerbatim = $@"C:\Users\{name}\SaveData\data.dat";
Console.WriteLine(pathVerbatim);
// 改行を含む複数行テキストにも使えます。
string target = "item_c";
int groupId = 3;
string report = $@"=== 処理報告 ===
対象名: {name}
関連 : {target}
グループ: {groupId}";
Console.WriteLine(report);
// --- { } 自体を出力したい場合は {{ }} と書きます ---
// { や } はそのまま書くと補間の構文と解釈されるため、二重にします。
Console.WriteLine($"補間の書き方: ${{変数名}}");
}
}
コンパイルして実行すると次のようになります。
dotnet script StringInterpolationVerbatim.cs
C:\Users\item_x\SaveData\data.dat
C:\Users\item_x\SaveData\data.dat
=== 処理報告 ===
対象名: item_x
関連 : item_c
グループ: 3
補間の書き方: ${変数名}
StringInterpolationRawLiteral.cs
using System;
// C# 11 以降の機能です。.NET 7 / C# 11 以上が必要です。
class StringInterpolationRawLiteral {
static void Main() {
// --- raw string literal(C# 11)---
// """ で囲む文字列です。{ } や \ をエスケープなしで書けます。
// $ を付けることで文字列補間も使えます。
string name = "item_x";
int score = 42500;
// $""" で始め、""" で終わります。インデントは終端 """ に合わせて自動で除去されます。
// $$ を付けると {{ }} が補間の区切りになり、{ } はそのまま出力されます。
string json = $$"""
{
"name": "{{name}}",
"score": {{score}}
}
""";
Console.WriteLine(json);
// --- {{ }} なしで { } をそのまま書くには $$ を使います ---
// $ の数を増やすと、埋め込みの区切り文字が {{ }} になります。
// $$ なら {{ 変数 }} が補間、{ } はそのままの文字として出力されます。
// $$ では {{ 変数 }} が補間、{ } はそのままの文字として出力されます。
// JSON のように { } と変数の埋め込みが混在するテキストに適しています。
string target = "item_b";
string template = $$"""
{
"target": "{{target}}",
"note": "スコアは {score} ではなく変数で管理"
}
""";
Console.WriteLine(template);
}
}
コンパイルして実行すると次のようになります。
dotnet script StringInterpolationRawLiteral.cs
{
"name": "item_x",
"score": 42500
}
{
"target": "item_b",
"note": "スコアは {score} ではなく変数で管理"
}
よくあるミス
$ を付け忘れて {変数} がそのまま出力される
文字列リテラルの先頭に $ を付け忘れると、{} の中身が補間されずそのまま文字列として出力されます。コンパイルエラーにはならないため気づきにくい点に注意が必要です。
string name = "test_user";
// $ が付いていないため {name} がそのまま出力されます。
string msg = "Hello, {name}!";
Console.WriteLine(msg); // Hello, {name}!
// 正しくは $ を付けます。
string msgOk = $"Hello, {name}!";
Console.WriteLine(msgOk); // Hello, test_user!
{ } をリテラルとして出力したいのにエスケープを忘れる
$"..." の中で { や } をそのまま出力したい場合は {{ }} と二重に書く必要があります。シングルブレースのまま書くとコンパイルエラーになります。
int x = 10;
// コンパイルエラーの例です。} がエスケープされていません。
// string bad = $"value = {x}, format: {0}";
// 正しくは {{ }} でエスケープします。
string ok = $"value = {x}, format: {{0}}";
Console.WriteLine(ok); // value = 10, format: {0}
概要
『C#』の文字列補間($"...")は C# 6.0 で導入された機能です。string.Format("{0}、{1}", name, power) と同等の処理をより読みやすい形で書けます。{} の中には変数だけでなく、メソッド呼び出し・演算・プロパティアクセス・三項演算子など、任意の式を書くことができます。
書式指定は {変数:書式} の形で string.Format と同じ書式文字列を使います。数値の桁区切り(:N0)・小数点以下の桁数(:F2)・ゼロ埋め(:D5)・パーセント表示(:P1)などがよく使われます。
@"..."(逐語的文字列)と組み合わせた $@"..." はファイルパスや複数行テキストを扱うときに便利です。文字の { や } をそのまま出力したい場合は {{ }} と二重に書きます。
C# 11 の raw string literal($"""...""")は JSON・SQL・HTML など多くの記号を含むテキストを扱うのに適しています。$ の個数を増やすことで埋め込みの区切り文字を {{...}} に変更でき、{} をエスケープなしでそのまま出力できます。詳細なデータ整形には『PadLeft() / PadRight()』や『Split() / Join()』も参照してください。null の可能性がある変数を $"..." に埋め込むと空文字として出力されます。null チェックを先に行いたい場合は『IsNullOrEmpty() / IsNullOrWhiteSpace()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。