読者です 読者をやめる 読者になる 読者になる

C# 3.0(以降)で自動プロパティにブレークポイントを設定する

C# 3.0から自動プロパティが実装され、フィールドの定義を省略できるようになりました。これはとても便利なのですが、getter/setterを書かないため、ブレークポイントが張れないという問題がありました。

通常のプロパティでは下図のようにget/set内でブレークポイントを設定すると、プロパティが参照された時にプログラムの実行を中断することができます。
f:id:wata_d:20111108235246p:image

しかし、自動プロパティでは同様のことができません(と思っていました。ググっても出てこないし)。
f:id:wata_d:20111108235248p:image

まあいざとなれば必要なときだけフィールド追加すればいいか……と思っていたのですが、暇だったので実験してみたら関数ブレークポイントでならちゃんと止まる事がわかりました。関数ブレークポイントはメインメニューの[デバッグ]-[ブレークポイントの作成]-[関数でブレーク]もしくはブレークポイントウィンドウの[新規作成]ボタンで追加することができます。
関数ブレークポイントは[ブレークポイントの作成]ダイアログで関数名を入力するとその関数にブレークポイントを設定してくれるというものですが、ここにプロパティの名前を入れるとプロパティにブレークポイントを設定してくれます。
f:id:wata_d:20111108235249p:image

ブレークポイントを設定してからデバッグ実行すると、そのプロパティを参照するとブレークがかかるようになります。
f:id:wata_d:20111108235251p:image

プロパティ名を設定するとget/set両方で止まりますが、set時にだけ止めたい、という場合は「Person.set_Age」という風に指定します(getterの場合は「Person.get_Age」)。これはILDASMなどを使うと確認できますが、プロパティのアクセサメソッドです。
ちなみにはまりポイントとしてブレークポイントの作成画面にある[関数名の確認にIntelliSenseを利用する]にチェックが入っていると、アクセサメソッドを指定したときに警告メッセージが表示されますが、これは無視して構いません。できないのか、と諦めかけつつダメ元で実行したらちゃんと認識してくれました。
f:id:wata_d:20111108235253p:image

set_Ageにブレークポイントを設定してからデバッグ実行すると、getでは止まらずsetでだけ止めることができます。
f:id:wata_d:20111108235254p:image

少し面倒ですがデバッグ時に使えるかもしれませんね。