C#の開発において、string型は最も頻繁に利用されるデータ型の一つです。そのため、文字列は不変性やリテラル表現の多様性など、多くの考慮がなされて設計されてきました。
基本的な文字列リテラル
最も基本的な文字列の定義は、ダブルクォーテーション""で囲む方法です。
var simpleMessage = "これは通常の文字列です。";
Console.WriteLine(simpleMessage);
補間文字列(Interpolated Strings)
C# 6で導入された補間文字列は、文字列内に変数の値を埋め込む際に、より直感的で読みやすい構文を提供します。文字列の前に$を付けることで、波括弧{}内にC#の式を直接記述できるようになります。
var userName = "山田太郎";
var currentDate = DateTime.Now;
Console.WriteLine($"ユーザー名: {userName}, 現在時刻: {currentDate}");
// 出力例: ユーザー名: 山田太郎, 現在時刻: 2023/01/06 15:37:13
// フォーマット指定も可能です
Console.WriteLine($"現在時刻: {currentDate:yyyy年MM月dd日 HH時mm分}");
// 出力例: 現在時刻: 2023年01月06日 15時37分
逐語的文字列(Verbatim Strings)
逐語的文字列は、文字列の前に@を付けることで定義され、エスケープシーケンス(例: \nや\")の処理方法を根本的に変更します。これにより、改行やバックラッシュを含む文字列を記述する際に、\を二重に記述する必要がなくなります。特に、複数行にわたるSQLクエリやファイルパスを記述する際に非常に便利です。
var filePath = @"C:\Program Files\MyApplication\Settings.config";
Console.WriteLine(filePath);
var multiLineSql = @"
SELECT
ProductId,
ProductName,
Price
FROM Products
WHERE Category = 'Electronics';
";
Console.WriteLine(multiLineSql);
補間文字列と逐語的文字列は組み合わせて使用することもできます。この場合、$@""または@$""のように記述します。
var minPrice = 10000;
var parameterizedSql = @$"
SELECT
ItemId,
ItemName
FROM Inventory
WHERE StockQuantity > 0 AND UnitPrice >= {minPrice}
ORDER BY ItemName;
";
Console.WriteLine(parameterizedSql);
C# 11 生文字列リテラル(Raw String Literals)
.NET 7で導入されたC# 11では、さらに強力な「生文字列リテラル」が追加されました。これは、3つ以上のダブルクォーテーション"""で囲むことで定義されます。生文字列リテラルは、主に以下のような点でこれまでの文字列定義を凌駕します。
- 複数行の文字列を、開始デリミタ
"""のインデントを基準としてきれいに記述できる。 - 文字列内部にダブルクォーテーション
"を自由に含めることができ、エスケープの必要がない。 - JSONやXMLのような構造化されたテキストデータを、より読みやすい形式で直接埋め込むことができる。
var indentedSql = """
SELECT
EmployeeID,
FirstName,
LastName,
Department
FROM Employees
WHERE IsActive = TRUE;
""";
Console.WriteLine(indentedSql);
この機能の最も大きな利点の一つは、文字列中に直接ダブルクォーテーションを含めることができる点です。これまでの方法では、エスケープ(\")や逐語的文字列("")が必要でした。
Console.WriteLine("""これは"引用符"を含む文字列です。""");
// 従来の表記との比較
Console.WriteLine("\"旧来の\"エスケープ");
Console.WriteLine(@"""逐語的""エスケープ");
生文字列リテラルは、特にJSON文字列を定義する際にその真価を発揮します。複雑なJSON構造も、そのままの形でコードに埋め込むことができます。
var jsonPayload = """
{
"orderId": "ORD-001-2023",
"customer": {
"id": "CUST-XYZ",
"name": "株式会社A",
"email": "info@example.com"
},
"items": [
{
"itemId": "ITEM-001",
"itemName": "C#入門書",
"quantity": 1,
"price": 3500
},
{
"itemId": "ITEM-002",
"itemName": "ASP.NET Core開発",
"quantity": 1,
"price": 5000
}
],
"totalAmount": 8500,
"status": "processing"
}
""";
Console.WriteLine(jsonPayload);
もちろん、生文字列リテラルも補間文字列と組み合わせることが可能です。この場合も$"""という形式で記述します。
var minimumRating = 4.5;
var dynamicFilteredQuery = $"""
SELECT
ReviewId,
ProductTitle,
Rating
FROM ProductReviews
WHERE Rating >= {minimumRating}
ORDER BY ReviewDate DESC;
""";
Console.WriteLine(dynamicFilteredQuery);
C#における文字列リテラルの進化は、開発者がより複雑なテキストデータを扱う際のコードの可読性と記述性を大幅に向上させています。特にC# 11の生文字列リテラルは、JSONやSQLなどの構造化されたテキストを扱う際の煩雑さを軽減し、よりクリーンなコード作成に貢献します。