【C#】文字列結合時にToString()は不要だった件

【C#】文字列結合時にToString()は不要だった件
2020年1月17日
スポンサーリンク

こんにちは。ゆとり(@yutori_techblog)です。

先日C#でコーディング中に気づいたことがあったので発信します。
題名にもありますように、文字列を結合する際にToString()が不要であることに気づきました。

例えば次のような例です。

MessageBox.Show(“フォームのサイズは” + this.Size.ToString() + ”です。“);

よくある例だと思います。
しかし、この例でToString()は不要です。

MessageBox.Show(“フォームのサイズは” + this.Size + ”です。“);

これでも同じ結果が得られます。

実行例:

ToString()があってもなくても同じ結果が得られる

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で定義を見てみるといろいろ気づくことがあって面白いですね。