文字列関連の新機能
ここからは、文字列関連の機能強化について紹介します。
UTF-8文字列リテラル(UTF-8 string literals)
C# 11では、文字列リテラルに接尾辞として「u8」を追加することで、文字列リテラルをUTF-8形式のバイト列として記述できるようになりました。
C# 10までは、UTF-8形式のバイト列が必要なときに、以下のようにbyte型の配列として記述していました。C#の文字(char)や文字列(string)はUTF-16という16ビットの値を基本にしていますので、UTF-8を取り扱うにはSpan<byte>といったバイト列が必要で、生成時には面倒な変換作業が必要でした。
ReadOnlySpan<byte> bytes = new byte[] { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x58, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00 };
C# 11では、これが文字列リテラルとして直接記述できることができるようになります。以下は、ReadOnlySpan<byte>型のbytesをUTF-8リテラル"Hello, World!"で初期化する例です。
ReadOnlySpan<byte> bytes = "Hello, World!"u8; Console.WriteLine("{0}", bytes[12]); // 実行結果:33
生の文字列リテラル(Raw string literals)
C# 11では、3個以上の二重引用符("""~)を使って、一切エスケープされない生の文字列リテラルを記述できるようになりました。
生の文字列リテラルにより、二重引用符(")やバックスラッシュ(\)、文字列補間のためのブレース({ })、改行などを含む文字列を、リテラルとしてそのまま記述できます。「"""」に囲まれた文字列は、次に「"""」が現れるまで見たままの文字列とできます。JSONなどをリテラルとして埋め込むときなどに役に立つでしょう。なお、「"""」は「3個以上」であればよいので、例えば4個の「""""」を使うことで「"""」をリテラルに含ませることができます。
以下は、生の文字列リテラルの記述例です。単一の行として記述してもよいですし、複数行に分けて記述することもできます。
// 単一行 var single_line = """{ name: "Yamauchi" }"""; // 複数行 var multi_line = """ " はそのまま " として使われる(二重引用符)。 \ も \ として使われる(バックスラッシュ)。 {} も特別な解釈はされない。 改行もそのまま反映される。 """; Console.WriteLine(single_line); // 実行結果:{ name: "Yamauchi" } Console.WriteLine(multi_line); // 実行結果:" はそのまま " として使われる(二重引用符)。 \ も \ として使われる(バックスラッシュ)。 {} も特別な解釈はされない。 改行もそのまま反映される。
「$"""」を使うことで、文字列補間を使うこともできます。この場合は、中かっこ({ })内に記述した式で文字列の内容が置き換えられます。
var first = "Yamauchi"; var last = "Nao"; // 単一行 var single_line = $"""first: "{first}", last: "{last}";"""; // 複数行 var multi_line = $""" first: "{first}", last: "{last}"; """; Console.WriteLine(single_line); // 実行結果:first: "Yamauchi", last: "Nao"; Console.WriteLine(multi_line); // 実行結果:first: "Yamauchi", last: "Nao";
文字列補間中の改行(Newlines in string interpolations)
C# 11では、文字列補間の中で中かっこ({ })の中に改行を含められるようになりました。
これにより、文字列補間の通常の書式($")にて中かっこ({ })の中を自由に改行できます。より複雑な式を文字列補間に埋め込みたいときに有用です。
var x = 100; var y = 200; var s = $"x+y: { x + y }, x-y: { x - y }"; Console.WriteLine(s); // 実行結果:x+y: 300, x-y: -100
なお、C# 10まででも「$@」を使うことで、同様の記述が可能でした。
まとめ
今回は、C# 11における新機能のうち、参照型や文字列関連の新機能を中心に紹介しました。次回は、switch文などで使えるパターンマッチングの拡充や、残りの新機能について紹介します。