次の関数を取ります:
DataTable go() {
return someTableAdapter.getSomeData();
}
この関数にブレークポイントを設定すると、戻り値を検査できますか?ページgo()
内のデータグリッドに直接結合されてい.aspx
ます。
返されたデータテーブルを検査する唯一の方法は、一時変数を使用することです。しかし、それは少し不便です。別の方法はありませんか?
次の関数を取ります:
DataTable go() {
return someTableAdapter.getSomeData();
}
この関数にブレークポイントを設定すると、戻り値を検査できますか?ページgo()
内のデータグリッドに直接結合されてい.aspx
ます。
返されたデータテーブルを検査する唯一の方法は、一時変数を使用することです。しかし、それは少し不便です。別の方法はありませんか?
回答:
私が知っていることではありません。あなたがあればという注意ください変数を追加し、それはリリースでは、コンパイラによって削除されますが、とにかくビルドします...
更新:
この機能はVS2013に追加されました。autosウィンドウで戻り値を確認したり$ReturnValue
、watch / immediateウィンドウで使用したりできます。
値は関数から戻った直後にのみ表示されるため、関数呼び出しにブレークポイントを設定し、呼び出しをステップオーバー(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コードのデバッグの経験がある人は、[自動]ウィンドウで関数の戻り値が提供される機能を使用した可能性があります。残念ながら、この機能はマネージコードには存在しません。戻り値をローカル変数に割り当てることでこの問題を回避できますが、コードを変更する必要があるため、これはそれほど便利ではありません。マネージコードでは、ステップオーバーした関数の戻り値を判別するのは非常に困難です。ここでは一貫して正しいことを行うことができないことがわかったので、デバッガーで誤った結果を出すのではなく、機能を削除しました。ただし、これをお客様に返却したいと考えています。CLRチームとデバッガチームは、この問題の潜在的な解決策をいくつか検討しています。残念ながら、これはVisual Studio 11の一部ではありません。
Visual Studio 2015について:
Marc Gravellが現在認めている回答によれば、
この機能はVisual Studio 2013に追加されました。autosウィンドウで戻り値を確認するか、ウォッチ/イミディエイトウィンドウで$ ReturnValueを使用できます
その回答は、この機能はVisual Studio 2015では機能しないとも述べています。これは(完全に)正しくありません。上のメソッド呼び出しの戻り値を調べ、以下の注意事項があります:
$ ReturnValueが認識されるようにするには、レガシー式エバリュエーターをオンにする必要があります(ツール/オプション/デバッグ/レガシーC#およびVB式エバリュエーターを使用)。それ以外の場合は、$ ReturnValue1を使用できます。
これをVisual Studio 2015 Enterpriseでテストしました。
$ReturnValue
機能しています。ただし、Use managed compatibility mode
デバッグオプションを有効にしている場合、戻り値はどこにも表示されません。
メニューツール → オプション、IntelliTraceに移動し、イベントと通話情報を収集するように設定を変更した場合。
前の呼び出しイベント(Ctrl+ Shift+ F11)に戻り、autosウィンドウでメソッド呼び出しから返された一時的な値をメソッド名の子として確認できます。
現在のメソッドの戻り値は表示されません。現在のメソッドで呼び出された最後のメソッドの戻り値が表示されるだけです。
だから、それは大丈夫です
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 2013をリリースしました。これは、デバッグモード(メニューDebug → Windows → Autos)で実行中にメニューからアクセスできるデフォルトの機能です。
多くの回避策がありますが、どれも満足できるようには見えません。
以下のJohn Skeetを引用するには(削除された回答についてコメント):
それでも私には不便に見えます-特にデバッグを開始する前に必要な戻り値がわからない場合。何かを返すたびに一時的な変数がコードを乱雑にする必要はありません。
理論的には、デバッガーは- return
変数を持つことができます。結局のところ、それはスタック上の単なる変数です:
unsafe {
int * sp = stackalloc int[1];
try {
return a+b;
}
finally {
Trace.WriteLine("return is " + *(sp+3));
}
}
したがって、これをVisual Studioの機能要求と見なしてください。
これをVisual Studio 2015で機能させるためのPascalKの答えをさらに詳しく説明したいと思います。メソッド呼び出しの戻り値を調べるに記載されていない隠し機能があるためです。
ネストされた関数呼び出しがある場合、疑似変数$ResultValueX
が自動的に作成されます。Xは関数呼び出しの順序を示します。したがって、などの呼び出しがある場合Multiply(Five(), Six())
、次の疑似変数が作成されます。
Five() | $ResultValue1 = 5
Six() | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30
私が知っている唯一の方法は、戻り行にブレークポイントを配置してから、Quick Watchウィンドウを呼び出して、返された式を入力することです。
someTableAdapter.getSomeData();
ただし、これが機能するのは、呼び出しがオブジェクトの状態を変更しない場合のみです(実行を再開するときに同じメソッドへの2番目の呼び出しがあるため)。
Debug→Autosウィンドウを開くと閉じます。実際の戻り値は表示されませんが、returnステートメントで評価された値が表示されます。
return x + y;
この行にブレークポイントを設定すると、Debug-Autosウィンドウにxとyの現在の値が表示されます。私が言ったように、それはあなたを閉じるだけです。ただ役立つようにしようとしています。それは反対票に値するとは思わない。
ええ、VB.NETに切り替えることで。; P( "Visual Studio"とだけ言いました。;)
私が覚えている限り(Visual BasicからVB.NETのすべてのバージョンまで)、関数名をクエリするだけです。これは、関数の先頭で暗黙的に宣言されたローカル変数のように「機能」し、その現在の値は、関数が非戻りステートメントを介して終了するとき(つまり、Exit Function
または単に通過するとき)に、もちろん、戻り値としても使用されます。returnステートメントが使用されます。
また、returnステートメントの式にも設定されます。ローカル変数と同様に、その値は関数内の任意の実行ポイント(returnステートメントの実行後を含む)で検査できます。C#にはこれがなく、必要です。
その小さなVB.NET機能(およびExit Function
それが有効にするステートメント-別の機能にはC#にはない機能と必要な機能)は、関数型名を常にエラー/デフォルト値に初期化する防御的プログラミングの形式で非常に役立ちます。最初のステートメント。次に、失敗ポイント(通常、成功ポイントよりもはるかに頻繁に発生します)で、Exit Function
ステートメントを呼び出すだけです(つまり、失敗/デフォルトの式や定数/変数名を複製する必要はありません)。