こんにちは、働くC#プログラマーのさんさめです。
VisualStudioを使ってデバッグしている最中に、
こんなことを思ったことはありますか?
- この条件でここに来るはずないんだけどなぁ…
今あのメソッド呼んだら何の値が返ってくる…? - なんか腐った値が変数に入ってるけど、
想定した値だった時の挙動を見たい… - さっきまで見ていたインスタンスと、
今見ているインスタンスが同一か知りたい
プロパティやローカル変数を刹那的に見る分には、
ローカルウィンドウやウォッチウィンドウで
さっと確認できますよね。
しかし、メソッドを呼び出してその様子や過程を見るとなると
そういうわけにもいきません。

GetHashCodeでインスタンスが
別物かどうかだけでも知りたいけど…
しゃーない、メモるか…
おおっと、ちょっと待ってください!
そんなときはイミディエイトウィンドウを使えば、
任意のメソッドを実行して結果を確認したり、
自由に値を加工して閲覧することができます
本記事ではイミディエイトウィンドウの基本的な使い方や、
どんな時に活用できるかについて解説します。
最後まで読めばデバッグの手段が確実に1つ増えます。
ぜひお付き合いください。
イミディエイトウィンドウとは
Microsoftのドキュメントによると、
イミディエイトウィンドウは、
以下を目的としたウィンドウとあります。
- 式のデバッグと評価
- ステートメントの実行
- 変数値の出力
いかにもデバッグのための
ウィンドウって感じがしますね。
表示するには、VisualStudioメニューバーから、
「デバッグ」→「ウィンドウ」→「イミディエイト」
を実行します。

すると、
キャレット以外何も表示されていない、
シンプルなウィンドウが表示されます。

イミディエイトウィンドウの基本使用方法
このウィンドウを使うためには、
ブレーク中であることが必須なので、
小さいプログラムを作って実際にブレークしてみます。

さて、この状態で試しに、
「a」とだけ入力してEnterを押してみます。

するとこのようにリスト変数aの中身が出力されました。
このように、イミディエイトウィンドウでは、
即時に値を評価することができます。

この程度ならローカルウィンドウや、
ウォッチウィンドウで良くない?
そうですね。これはあくまでも基本の紹介です。
イミディエイトウィンドウの真の実力は、
値を評価するだけでなく式を実行できることにあります。
イミディエイトウィンドウで任意の式を実行する
では次に、aに要素を追加してみましょう。

なんか言われましたね。
Addは戻り値がvoidなので、表示するものが無いってことですね。
式は評価されたとのことなので、
この状態でaにマウスオーバーしてみます。

ちゃんとAddされてます。おぉ~。
ちなみに、foreachはできません。無念。

とはいえ、LINQなんかはちゃんと評価されるので、
整形して出力するなんてこともできます。

Console.WriteLineもちゃんと使えます。
(WPFアプリの場合はコンソールがないので、
Debug.WriteLineを使いましょう)

変数自体を書き換えることももちろん可能です。

どうでしょう。
イミディエイトウィンドウのなんでもアリな感じが
伝わってきましたか?
次に、
さんさめが実際に業務で使って便利だった使用例を
いくつか紹介していきます。
イミディエイトウィンドウの便利な使用実例
要素数が100を超えるようなコレクションの中身をダンプ
あるとき、デバッグ中に
要素数が多いコレクションの中を
1つ1つ確認したくなることがありました。

しかし、ローカルウィンドウや、
マウスオーバーで数百もの要素を1つずつ目視していくのは、
大変ばからしい作業です。
かといって、エディットコンティニューをして
コードを汚すのもそれはそれで面倒臭い…。
そんなときにイミディエイトウィンドウを活用しました。
イミディエイトウィンドウでおもむろに
listを表示すべく評価!

お、なんかいい感じ…


………って、おい!!
なんと、イミディエイトウィンドウでも
全部は表示してくれませんでした。無念。
そこで、考え方を変えました。
まず、さきほどの要領でstring.Joinを使って文字列として結合し…
おもむろにDebug.WriteLineを呼びます!

ご覧の通り、
イミディエイトウィンドウでDebug.WriteLineを呼ぶと、
そのウィンドウにそのまま出力してくれます。
あとは、これをコピーして、
適当なテキストエディタで開きgrepをかけるだけです。

簡単に場所が分かりました。
今回は話を簡単にするために、
intのListを使いましたが、
クラスのコレクションであっても考え方は一緒です。
これで、要素を特定してしまえば、
あとはウォッチに追加するなりしてじっくり値を確認できます。

GetHashCodeを呼んで同一性の確認
マルチスレッドプログラミングをしていたり、
同じクラスのインスタンスが大量にあるときに、
「あれ、これさっき見ていたオブジェクトと一緒かな?」
と混乱することがあります。
そんなときは、ブレークで止まるたびに、
オブジェクトのGetHashCodeを呼ぶことで、
同じインスタンスかどうかを簡単にチェックできます。
以下の画像では、ブレークポイントに到達するたびに、
イミディエイトウィンドウでGetHashCode()を呼んでいます。

実は、GetHashCode()単体の結果なら、
ウォッチウィンドウでも見られます。

でも、イミディエイトウィンドウならば、
前の値が残ってるので比較が簡単ですね。
ちなみに、
イミディエイトウィンドウを使い倒し過ぎて文字が沢山。
スクロールがつらいよ…となったら、
右クリック→「すべてクリア」
でいつでもきれいにできます。

実際にはもっと色々使える場面があるはずです。
頭の引き出しの中に蓄えておくと、
きっとあなたのデバッグの役に立ってくれますよ。
まとめ
まとめです。
- VisualStudioにはイミディエイトウィンドウという
デバッグツールがある - イミディエイトウィンドウを使えば
ブレーク中に値を見たり変えたり、
メソッドを呼んだり色々なことができる - 業務中に便利だった実際の使用例を紹介
最後までお読みいただき、ありがとうございました。
コメント