C#で、UTF8のbyte[]を作りたいときがあります。
実際のアプリに組み込む場合もありますし、テストで作りたい場合もありそうです。
C#11での書き方をいろいろ列挙してみます。
{"value":0.123}
上記のJSONを作る場合でやってみます。
public static byte[] JsonSample0 = Encoding.UTF8.GetBytes("{\"value\":0.123}");
結構昔から書ける書き方です。
初期化時に、UTF16→UTF8への変換コストがかかります。
public static byte[] JsonSample1 = Encoding.UTF8.GetBytes("""{"value":0.123}""");
JsonSample0と違って、C#11から使える”””を使ってみました。
“をエスケープしなくて良い分、見た目が良くなってミスが減りそうです。
public static byte[] JsonSample2 = "{\"value\":0.123}"u8.ToArray();
public static byte[] JsonSample3 = """{"value":0.123}"""u8.ToArray();
“”u8を使って、ReadOnlySpan<byte>が作れるので、そこからbyte[]に変換します。コピーのコストは発生しますが、UTF16→UTF8の変換に比べると、変換の速度はかなり速いです。
“をエスケープする方法と、”””でエスケープを外す方法を書いてみました。
public static byte[] JsonSample4 = new byte[] { (byte)'{' ,(byte)'"' ,(byte)'v' ,(byte)'a' ,(byte)'l' ,(byte)'u' ,(byte)'e' ,(byte)'"' ,(byte)':' ,(byte)'0' ,(byte)'.' ,(byte)'1' ,(byte)'2' ,(byte)'3' ,(byte)'}' , };
byte[]を直接作るとこんな感じ。
パフォーマンスはたぶん良いと思いますが、メンテナンスがつらいところですね。
というところで、私はJsonSample3を使っていくことになりそうです。
追記 2023/2/23
「ab”」のように、”で終わる場合、JsonSample3の書き方はできません。その場合、複数行モードで、以下の様な書き方がよさそうです。
public static byte[] JsonSample5 = """
ab"
"""u8.ToArray();
この書き方だと、3byteのArrayになって、改行は入らないです。