7

あなたがデバッグしているとしましょう。ある時点でメソッドAにあり、パラメータFooのfooがあります。後でメソッドBに入ります。このメソッドは、タイプFooのパラメータfooも取ります。異なるスコープで2つの変数の参照等価を決定するにはどうすればよいですか?

これらの2つの変数は同じFooインスタンスでも同じですが、どのように伝えますか?それらは異なる範囲にあるので、ReferenceEquals()に電話をかけることはできません。あなたがインスタンスであるかどうかを知るために、変数が指す実際のメモリ位置を得ることができる方法はありますか?

答えて

6

私はあなたができると信じてMake Object ID機能を使用してください。これについての詳しい情報は、here見つけることができますが、要約する:あなたがスコープ内にあるオブジェクト変数に取得することができ、あなたのコードにブレークポイントを設定し

  1. を。
  2. コードを実行し、ブレークポイントで停止させます。
  3. ローカルまたはオートウィンドウで、オブジェクト変数(値の列に注意してください)を右クリックし、コンテキストメニューから「オブジェクトIDを作成」を選択します。
  4. [値]列に新しいID番号(#)が新しく表示されます。

オブジェクトに「マークする」と、Fooの2回目の呼び出しで割り当てられたIDが表示されます。

var whatever = foo; 

そして、第2の方法では、次のように入力したときに:第一の方法の内側にイミディエイトウィンドウに次のように入力マークシダデの提案の開発など

+0

非常に良い。それはVSの古いバージョンで利用できますか、それは新しいものですか? – Chris

+0

@Chris - VS2008は今のところ横たわっていませんが、2008年と2010年にサポートされています.VS2010でこれを確認しました。 – CodeNaked

+0

申し訳ありません。私はちょうど私が尋ねた後に気づいた。 :( – Chris

1

デバッガでは、最初のメソッドのオブジェクトへの参照を静的フィールドに格納し、2番目のメソッドの変数を静的フィールドと比較できます。

+1

提案していただきありがとうございます。値を受け取るためにデバッグする前に静的なフィールドをコードに作成しなければならないということですか?おそらく少し侵入します... – David

+0

はい、あなたはそれをしなければならないでしょう。 –

0

変数へのポインタを取得できますが、これは安全でないブロックで実行する必要があります。

Foo* p = &myFoo; 

これはすでにSOにここで議論されています:あなたはこのようなあなたのFooへのポインタを宣言することができ、 "unsafed" です一度

C# memory address and variable

0

bool test = object.ReferenceEquals(whatever, foo); 

イミディエイトウィンドウには、テストの結果が表示されます。

ただし、CodeNakedの提案が優れています。

関連する問題