2009-02-21 13 views
5

この動作(ウォッチウィンドウのリフレッシュシンボルと警告)を使用して、フレームワーク内にいくつかのクラスがあります。これは属性によって制御されていますか?もしそうなら、私はこれを私の図書館でエミュレートできますか?デバッガ内のプロパティ評価を防止するための.Net属性はありますか?

編集:ありがとうございました!明確にするために、私は単一のスレッドからデータにアクセスしなければならないプロパティを持つフレームワークを開発しています。残念ながら、ウォッチウィンドウなどのために私がデバッガに入っているときに私は奇妙な振る舞いをしています。デバッガのブラウズ可能な属性に関する経験があります。しかし、私はメインスレッドがそれらにアクセスした後にプロパティを表示することを好みます/それらを設定します。私は特に、IEnumerablesでデバッガがユーザーの入力なしで評価されないことを見てきました。 ...これらのプロパティを「暗黙の評価」が必要なものとしてフラグを立てる方法はありますか、それとも私のケーキを食べることはできませんか?

答えて

6

これは属性によって制御されていません。これはデバッガの固有の機能です。

この機能の根底にある理由は、ユーザーによる望ましくない機能評価を防止するためです。 Func Evalsはデバッガでは危険な動作であり、プログラムの状態が著しく遅くなったり破損したりする可能性があります。デバッガは、誤ってデバッグ経験を低下させる可能性のある追加の関数を実行しないように注意しています。

watch/locals/autoウィンドウに関数が発生する可能性のある項目があり、デバッガが関数の実行を信じないと、値がグレー表示され、更新ボタンが表示されます値の列。そのボタンをクリックすると、デバッガに「実際にその式を評価してはいけません」と伝えられます。

これはデバッガで発生する理由はたくさんあります。次の2は最も可能性が高いですが。

暗黙的特性評価は無効になっています

ツール - >デバッガ - >オプション - >は、この値はオフになっている場合は、自動評価しないでください暗黙の特性評価が

、デバッガを言っているの有効化プロパティ。フードの下のプロパティは単に関数呼び出しです。通常は、通常の関数呼び出しよりも安全ですが、必ずしもそうではありません。

ただし、ウォッチウィンドウに直接入力することでプロパティの評価を強制することもできます。行に2を入力すると、最初の値は「失効」になります。これは、ウォッチウィンドウに2番目の式を入力すると、他のすべての式が再評価されるためです。どうして?いずれかの表現を評価する行為が他の表現の結果を変更した可能性があるためです。

暗黙のfunc evalがオフになっているため、最初のプロパティは自動評価されず、強制的に実行する必要があります。

のFunc評価およびステップ

あなたは関数の評価を行い、ウォッチウィンドウに式を追加して、ステップの操作を行う場合は、値がウォッチウィンドウで「staled」されます。

これは多くの理由から行われていますが、これは最も重要な理由の1つです。ユーザーがウォッチウィンドウに多くの式を入力するのは非常に一般的です。関数評価を行うことは間違いありません。これらはあまり遅くない。しかし、あなたがいくつかのコードをすばやく進めようとしているとし、ウォッチウィンドウで10個の機能を確認したとします。それはすぐに足を伸ばし、あなたのステッピング体験を大幅に低下させます。だから、funcのevalsは自動的に再評価されません。

+2

私はマウスを動かすべきではなく、モックのプロパティを評価することによって、いくつかのデバッグセッションを台無しにしました。それは私が窓から設定した期待を投げた。 –

4

これは参照しているリフレッシュアイコンを生成しませんが、非常に便利な属性はSystem.Diagnostics.DebuggerBrowsableAttributeです。このフィールドを使用すると、ウォッチウィンドウにフィールドが表示されないようにすることができます。これは、プロパティアクセサーによってフィールドが複製され、それらが2回表示される必要がない場合、またはプロパティが何らかの実質的な操作(提案しているようなもの)を実行していて、デバッガが、それを評価する。

1

これはあなたが探しているものではありませんが、プロパティのゲッター/セッターに[DebuggerStepThrough]属性を適用すると、明示的に行にブレークポイントを設定しない限り、デバッガーがプロパティを破壊しないようになります。これは、評価するのが安全であることを知った後で、ブレークポイントを待って設定したい場合に便利です。すべてのデバッグを非表示にする場合は、[DebuggerHidden]を使用することもできます。

関連する問題