コンパイラが2つをどのように扱うかを説明するために、例を追加します. :
bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel,
value ? "ON" : "OFF");
最後の行は次のようにコンパイルされます。
String s = String.Format(":Channel{0}:Display {1}",
new object[2] {(object)channel, value ? "ON" : "OFF")};
興味深いことに、 の配列と「ボックス」の作成、および/int channel
を見つけるために必要な追加の解析に注意してください。{0}
{1}
今ナンバー2:
bool value = true;
String channel = "1";
string s = ":Channel" + channel + ":Display " + (value ? "ON" : "OFF");
最後の行は次のようにコンパイルされます。
string s = string.Concat(":Channel", channel, ":Display ", value ? "ON" : "OFF");
ここには、配列もボックスもありません (channel
は文字列になりました)、解析もありません。オーバーロードはpublic static string string.Concat(string,string,string,string)
; string.Concat
適切なサイズの文字列を事前に割り当ててから上書きするなど、非常に効率的に実装されます。
ほとんどのコードでは、どちらでもかまいません。2 番目のバージョンは、技術的にはより効率的 (ボックスなし、配列なし、解析なし) ですが、後で国際化する場合は大きな問題になります。ほとんどのアプリケーションでは、この 2 つの違いに気付くことはありません。解析は高速で、ボックス/配列はジェネレーション ゼロ オブジェクトとして安価に収集されます。しかし、安いことはタダではありません。