10

何か変なものを見たとき、コードをデバッグしていました。基本的には次のようになりました。

奇妙さ

ここに表示されるのは、負の値を持つ unsigned int です...

value pop-upまた、周囲の変数には(?)がないものとあるものがあることにも気付きました。しかし、この変数はあり得ない値を持つ唯一の変数でした。

これはどのように可能ですか?

私は C# Visual Studio 2010 しか持っていないので、この問題が他のバージョンや異なる言語に存在するかどうかはわかりません。その場合は、タイトルとタグを適宜変更します。

4

2 に答える 2

8

デバッグ中、Visual Studio は現在のコンテキストですべての変数を追跡します。

次のコードを検討してください。

void SomeMethod1()
{
    int j = 0;
}

void SomeMethod2()
{
    int i = 0;
}//Breakpoint on this line.

プログラムが中断するとき、現在のコンテキストはSomeMethod2です。この時点で、開発者は の値がどうなるかを確認できませんj。これはint j 、現在のコンテキストでは変数ではないためです。

OPの説明された動作の背後にある実際の理由:

Visual Studioは、変数の名前が現在のコンテキストに存在するかどうかを確認し、変数自体が現在のコンテキストに存在するかどうかは確認しません

したがって、変数の名前jiinSomeMethod1に変更すると、その「値」が突然表示されます。iinSomeMethod2が文字列であるとしたら、どのように奇妙になるか想像してみてください。

ここに画像の説明を入力

これをいつ知る必要がありますか?

現在のコンテキストが何であるかがすぐに明確でないコードがあるときはいつでも。次のコードでこの問題が発生しました。

private double CalculateFast(double d)
{
    //Depending on the size of d, either [Method 1] or [Method 2] is faster.
    //Run them both and use the answer of the first method to finish.
    Tasks.Task.Factory.StartNew(() = >
    {
        //Method 1   
    }

    //Method 2

    return answer;
}

私はデバッグMethod 2していましたが、変数も表示できると思いMethod 1ました。しかしMethod 1、独自のコンテキストがあるため、そうではありませんでした。

于 2013-08-08T12:56:33.177 に答える
1

試してみてください:

  • クリーン ソリューション
  • ソリューションの再構築
  • 成功しない - PDB ファイルを手動で (または bin および obj フォルダー全体を) kill し、再構築します。

それが役立つことを願っています。

于 2013-08-08T19:11:27.137 に答える