string.Formatや$記法のメモリ消費に気をつけよう

$ - 文字列補間 - C# リファレンス
文字列補間では、従来の複合文字列の書式設定よりも読み取りやすく、便利な構文を書式指定文字列の出力に提供します。

string.Formatや$(文字列補間)便利ですよね。また内部的にはStringBuilderを使っているので大きな文字列の+演算に比べるとメモリ消費も少なく済みます。

しかしギリギリまでメモリ消費抑えたいシチュエーションでは注意が必要です。

Is String.Format as efficient as StringBuilder
Suppose I have a stringbuilder in C# that does this: StringBuilder sb = new StringBuilder(); string cat = "cat"; sb.Append("the ").Append(cat).(" in the hat");...

そもそもstring.Format や$は内部でStringBuilderを都度newしています。もうこの時点でもったいないですよね。アプリで一個だけStringBuilderをnewして使いまわしたいというのが心情です。

可変長引数
概要 C# では params キーワードを用いることでメソッドの引数の数を可変にすることが出来ます。 ポイント 定義側の例:int Sum(params int[] args) {…

さらにstring.Formatはparams 可変長引数をとります。これは内部的には配列をnewしています。(引数3つまでならparams使わないのでOK)加えてobject[] 型なので油断してint型を渡すとboxingが発生し無駄なgc allocが走ります。

まとめ

ここまできたらstatic StringUtil.Concat(object i0, object i1, object i2…) みたく自前の文字列連結関数用意して上げた方がいい気がします。犠牲になるのは可読性です。個人的にはAssetBundleパスみたいな長いやつは可読性を犠牲にしてもメモリ消費抑えるために専用StringBuilder or FastStringを使うのがよいと考えてます。