宿題の答え

このアプリケーションをVisualStudio2005(β2)でステップ実行を用いてデバッグを行うとあるエラーが発生してアプリケーションは異常終了します。アプリケーションが異常終了するのは何故でしょうか。またどんな例外(エラー)が発生するのでしょうか。

答えがあまりに簡単で馬鹿馬鹿しかったのか反応が無くて寂しかったのだけれどこの際備忘録として書いておこう。

答え:
アプリケーションが異常終了するのはToString()メソッド中でフィールド"root"を参照しているために同メソッドが永久に再帰するのが原因。StackOverflowExceptionが発生する。
ToString()メソッドはアプリケーション中では一度も呼ばれていないがC#はデフォルトの設定としてデバッグ時に変数のビジュアライザが使用された時にToString()を呼び出すことになっているのでアプリケーションに関係なくToString()が呼ばれてしまう。

ToString()はJavaのプログラミングを始めた時から習慣としてオーバライドしていたのですがC#でも同様に書いていたらバグに気がつくのが遅れてしまったようです。ToString()メソッドがデバッグ時にも呼ばれるというのは自分の意図した情報を逐一デバッガで確認できるので便利なのですがオブジェクトグラフを辿って呼ばれるのは当然ながらかなり負荷の高い処理になってしまいます。上手くできているものでそれを避けるためにデバッガがビジュアライザ等でToString()メソッドを勝手に呼び出してしまうのはVisualStudio2005のオプション->デバッグ->全般から"変数ウインドウのオブジェクト上でToString()を呼び出す(C#のみ)"のチェックを外すことで抑制できます。