次の機能を実行します。
DataTable go() {
return someTableAdapter.getSomeData();
}
この関数にブレークポイントを設定すると、戻り値を検査する可能性はありますか? go()
は、.aspx
ページのデータグリッドに直接結合されます。
返されたデータテーブルを検査する唯一の方法は、一時変数を使用することです。しかし、それは少し不便です。別の方法はありませんか?
私が知っていることではありません。変数を追加doすると、リリースビルドのコンパイラーによって変数が削除されることに注意してください...
更新:この機能はVS2013に追加されました 。 autosウィンドウで戻り値を確認するか、watch/immediateウィンドウで$ReturnValue
を使用できます。
値は、関数から戻った後にのみ直接見ることができます。したがって、値にアクセスする最も簡単な方法は、関数呼び出しにブレークポイントを設定し、呼び出しをステップオーバー(F10)することです。
VS2015の更新:ブー!残念ながら、VS2015(devenv v14)にはないようです。
VS2017の更新:戻ってきました。 (devenv v15)
これは、CLR 4.5.1を使用してVisual Studio 2013で行うことができます 顧客のフィードバックサイトによる 。 C#の以前のバージョンでは使用できませんでした。
(Visual Studio 2008以前ではVB.NETでサポートされていました。C/ C++開発者は常に利用可能です。)
Microsoftによると、これをマネージコードで確実に実装する方法はありません。これは、彼らが認識し、取り組んでいる問題です。
ネイティブC++またはVB6コードのデバッグの経験がある人のために、Autosウィンドウで関数の戻り値が提供される機能を使用した可能性があります。残念ながら、この機能はマネージコードには存在しません。戻り値をローカル変数に割り当てることでこの問題を回避できますが、コードの変更が必要になるため、それほど便利ではありません。マネージコードでは、ステップオーバーした関数の戻り値を決定するのは非常に困難です。ここでは一貫して正しいことを行うことができないことに気づいたため、デバッガで誤った結果を表示するのではなく、機能を削除しました。ただし、これをお客様に提供したいと考えており、CLRとデバッガーのチームはこの問題に対する多くの潜在的な解決策を検討しています。残念ながら、これはVisual Studio 11の一部ではありません。
Visual Studio 2015について:
Marc Gravellが現在受け入れている回答によると:
この 機能がVisual Studio 2013に追加されました 。 autosウィンドウで戻り値を確認するか、watch/immediateウィンドウで$ ReturnValueを使用できます
その答えは、この機能はVisual Studio 2015では機能しないとも述べています。これは(完全に)真実ではありません。 Onメソッド呼び出しの戻り値を調べるには、次の注意事項があります。
$ ReturnValueが認識されるようにするには、レガシー式エバリュエーターをオンにする必要があります(ツール/オプション/デバッグ/使用レガシーC#およびVB式エバリュエーター)。それ以外の場合は、$ ReturnValue1を使用できます。
Visual Studio 2015 Enterpriseでこれをテストしました。
メニューに移動した場合ツール→オプション、IntelliTrace、設定を変更してイベントとコール情報を収集します。
前の呼び出しイベントに戻ることができます(Ctrl + Shift + F11)そして、メソッドウィンドウからメソッド名の子としてメソッド呼び出しから返された一時的な値を確認します。
これは、現在のメソッドの戻り値を示しているのではなく、現在のメソッドで呼び出された最後のメソッドの戻り値を示しているだけです。
だから、それは大丈夫です
DataTable go(){return someTableAdapter.getSomeData();}
someTableAdapter.getSomeData()
の戻り値を示しているため。
ただし:
int go(){return 100 * 99;}
.NET以前の時代からの古いトリック:[レジスタ]ウィンドウを開き、EAXレジスタの値を確認します。これには、最後に呼び出された関数の戻り値が含まれます。
Shift-F11を使用してgo()メソッドから出ると、「Autos」デバッグウィンドウに、スタックからポップしたメソッド呼び出しの戻り値が表示されます(この場合、go()メソッドはあなたが欲しいもの)。これはVisual Studio 2005の動作です。私はVisual Studio 2008を使用したことがないので、そのバージョンでこれが同じように動作するかどうかはわかりません。
はい、とてもいい方法があります。重大な欠点の1つは、5年、おそらく6年待たなければならないことです。 2008年11月に投稿されたことがわかりましたので、waaaaaa ...
...すごい。そしてほら!ちょうどあなたのために、MSは最新のVisual Studio 201をリリースしました。これは、メニューからアクセスできるデフォルト機能です実行中デバッグモード(menuDebug→Windows→Autos)。
多くの回避策がありますが、満足できるものはありません。
以下のジョン・スキートを引用するには(今削除された回答についてのコメント):
まだ私には不便に見えます-特に、デバッグを開始する前にどの戻り値が必要かわからない場合。何かを返すたびに一時的な変数がコードを乱雑にする必要は本当にありません。
理論的には、デバッガーはreturn
-変数を持つことができます。結局のところ、それは単にスタック上の変数です:
unsafe {
int * sp = stackalloc int[1];
try {
return a+b;
}
finally {
Trace.WriteLine("return is " + *(sp+3));
}
}
したがって、これはVisual Studioの機能要求であると考えてください。
Microsoft Visual C++はこれを実行していましたが、Visual Studioは知りません。
PascalK's answer Visual Studio 2015でこれを機能させるために拡張したかったのは、に文書化されていない隠し機能があるためです return returnメソッド呼び出しの値。
ネストされた関数呼び出しがある場合、疑似変数$ResultValueX
が自動的に作成されます。Xは関数呼び出しの順序を指します。したがって、Multiply(Five(), Six())
などの呼び出しがある場合、次の疑似変数が作成されます。
Five() | $ResultValue1 = 5
Six() | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30
私が知っている唯一の方法は、リターン行にブレークポイントを配置してからQuick Watchウィンドウを呼び出し、返された式を入力することです。
someTableAdapter.getSomeData();
ただし、これは、呼び出しがオブジェクトの状態を変更しない場合にのみ機能します(実行を再開するときに同じメソッドへの2回目の呼び出しがあるため)。
フラグや他の変数を設定せず、何かを返すだけの場合は、中間ウィンドウの値を評価するように依頼することもできます。
受け入れられた回答 はVisual Studio 2015では正常に機能しませんが、メソッドの最後の行にブレークポイントを配置し、 F10、戻り値のすべての式をローカルウィンドウに配置します。
[デバッグ]→[自動]ウィンドウを開くと、閉じられます。実際の戻り値は表示されませんが、returnステートメントで評価されたものが表示されます。
ええ、VB.NETに切り替えて。 ; P(「Visual Studio」と言っただけです。;)
覚えている限り(Visual BasicからVB.NETのすべてのバージョンまで)、関数名を照会するだけです。これは、関数の開始時に暗黙的に宣言されたローカル変数のように「機能」し、その現在の値は、非戻りステートメント手段を介して関数が終了するたびに戻り値としても使用されます(つまり、Exit Function
または単に通過)そしてもちろん、returnステートメントが使用される場合。
また、returnステートメントの式にも設定されます。ローカル変数と同様に、その値は、関数内の実行の任意の時点(returnステートメントの実行後を含む)で検査できます。 C#にはこれがありません。
その小さなVB.NET機能(および有効にするExit Function
ステートメント-別の機能C#にはないため、そうする必要があります)は、 defensive programming という形で非常に便利です。最初のステートメントとして、関数名を失敗/デフォルト値に初期化します。次に、任意の障害ポイント(通常は成功ポイントよりもはるかに頻繁に発生します)で、Exit Function
ステートメントを呼び出すことができます(つまり、障害/デフォルト式または定数/変数名を複製する必要はありません)。
レジスタウィンドウ(デバッグ/ウィンドウ/レジスタ)でRAXレジスタを見れば、これを判断できると思います。関数をステップアウト(SHIFT + F11)した後、RAXレジスタを確認します。事実はわかりませんが、月が来ると、レジスターを(.NET日前に)チェックして、戻り値を見ることができます。 RAXとRBXなどの組み合わせであってもかまいません。
"someTableAdapter.getSomeData();"
を選択して右クリックし、Quick Watchを選択してみてください。