こんにちは。ゆとり(@yutori_techblog)です。
先日C#でコーディング中に気づいたことがあったので発信します。
題名にもありますように、文字列を結合する際にToString()が不要であることに気づきました。
例えば次のような例です。
MessageBox.Show(“フォームのサイズは” + this.Size.ToString() + ”です。“);
よくある例だと思います。
しかし、この例でToString()は不要です。
MessageBox.Show(“フォームのサイズは” + this.Size + ”です。“);
これでも同じ結果が得られます。
実行例:


String型の+演算子オーバーロードを確認しよう
このことはString型の+演算子のオーバーロードを確認すれば気付くことができます。
まずは、String型とString型の+演算子の定義。

続いて、String型とSize型の+演算子の定義。

このように、String型とObject型で+演算子が定義されています。
ということは、String型とはどんなオブジェクトでも+演算子を使うことができるということです。
おそらく、object型が来た場合は中で自動でToString()してくれるのでしょう。
試しに、FormのToStringを次のようにオーバーライドしてみます。
public override string ToString() {
MessageBox.Show("オーバーライドしたToString()が呼ばれたよ");
return base.ToString();
}
その上で、次のコードを実行します。


直接的にToString()を呼んでいないのに、ToString()内に記述したMessageBoxが表示されました。
すなわち、String型とObject型の+演算子のメソッド内で、ToString()を呼んでくれていることがわかると思います。
まとめ
- +演算子による文字列結合時にToString()は不要
- String型とObject型の+演算子内で勝手にToStirng()が呼ばれてる
以上です。
VisualStudioで定義を見てみるといろいろ気づくことがあって面白いですね。