2011-09-02 10 views
7

Digamos que estás depurando. En un punto estás en el Método A, que tiene un parámetro foo del tipo Foo. Más tarde se encuentra en el Método B, que también toma un parámetro foo del tipo Foo.¿Cómo se determina la igualdad de referencia de dos variables en diferentes ámbitos?

Estas dos variables pueden ser la misma instancia de Foo, pero ¿cómo se sabe? Debido a que tienen un alcance diferente, no puede llamar al ReferenceEquals(). ¿Hay alguna forma de que pueda obtener la ubicación real de la memoria a la que apuntan las variables para que pueda saber si son la instancia?

Respuesta

6

Creo que se puede use la función Make Object ID. Más información sobre esto se puede encontrar here, pero para resumir:

  1. un punto de ruptura en el código donde se puede llegar a una variable de objeto que está en su alcance.
  2. Ejecuta tu código y deja que se detenga en el BreakPoint.
  3. En su ventana Locals o Autos, haga clic con el botón derecho en la variable del objeto (tenga en cuenta la columna Valor) y seleccione "Crear ID del objeto" en el menú contextual.
  4. Ahora debería ver un nuevo número de ID (#) nuevo en la columna Valor.

Después de "marcar" el objeto, verá la identificación asignada en la segunda llamada a Foo.

+0

Muy agradable. ¿Está disponible en versiones anteriores de VS o es algo nuevo? – Chris

+0

@Chris - No tengo VS2008 por ahora, pero la página dice que es compatible en 2008 y 2010. Lo he verificado en VS2010. – CodeNaked

+0

Sí, lo siento. Solo lo noté después de preguntar. :( – Chris

1

Mientras está en el depurador, puede almacenar una referencia al objeto en el primer método en un campo estático y luego comparar la variable en el segundo método con el campo estático.

+1

Gracias por la sugerencia. ¿Quiere decir que tendría que crear un campo estático en el código antes de la depuración para poder recibir el valor? Un poco intrusivo tal vez ... – David

+0

Sí, tendrías que hacer eso. –

0

bien podría obtener un puntero a su variable, pero esto requiere que se ejecute en un bloque inseguro.

una vez que esté "unsafed" se puede declarar un puntero a su Foo así:

Foo* p = &myFoo; 

esto ha sido ya discutido aquí en SO:

C# memory address and variable

0

Como desarrollo de la sugerencia de Mark Cidade, cuando están dentro del primer método escriba lo siguiente en la ventana inmediata:

var whatever = foo; 

Entonces, cuando en el segundo método, escriba lo siguiente:

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

La ventana inmediata mostrará el resultado de la prueba.

Sin embargo, la sugerencia de CodeNaked es mejor.

Cuestiones relacionadas