Identificación única de tipos de referencia en el depurador

Vengo de un fondo de C ++, así que me disculpo si esta es una forma de pensar que no es de C, pero solo necesito saberlo. 🙂

En C ++ si tengo dos punteros, y quiero saber si apuntan a lo mismo, puedo mirar en la ventana de memoria / observación y ver su valor, para ver si apuntan al mismo espacio de memoria.

En C #, no he podido encontrar algo en esa línea. Un tipo de referencia con exactamente los mismos valores podría ser exactamente el mismo objeto, o podría ser algo muy diferente.

¿Hay alguna manera de ver este tipo de información en C #? Tal vez algún tipo de equivalente al operador & para la ventana del reloj o algo así?

Lo que estás buscando son identificaciones de objeto. Para cualquier tipo de referencia en el depurador, puede hacer clic con el botón derecho y decir “Crear ID de objeto”. Esto agregará un sufijo # a la columna de valor siempre que esa instancia se muestre en el depurador. También puede agregar # 1, # 2, etc. a la ventana del reloj para verlos de nuevo en cualquier momento posterior.

Paso 0: ejecuta este código

static void Main(string[] args) { var x = "a string"; var y = x; System.Diagnostics.Debugger.Break(); } 

Paso 1: haga clic con el botón derecho y seleccione “Hacer Id de objeto”

texto alternativo

Paso 2: las instancias ahora se muestran con el sufijo 1 #. Nota: no hice nada especial en este paso. Inmediatamente después de hacer clic en “Crear ID de objeto”, ambas filas se actualizan para mostrar el sufijo 1 #, ya que se refieren a la misma instancia.

texto alternativo

Paso 3: Véalos en cualquier momento agregando 1 # a la ventana del reloj

texto alternativo

En los proyectos de C #, si hace clic con el botón derecho en el nombre de una variable en una de las ventanas variables y selecciona “crear ID de objeto”, Visual Studio asignará una ID única a esa instancia y la mostrará en la columna Valor. Los ID se ven como {1 #}, {2 #}, etc. Si dos objetos tienen el mismo ID, entonces son referencialmente idénticos.

En el código o en la ventana Inmediato, también puede verificar si dos objetos son idénticos utilizando Object.ReferenceEquals ().

No creo que haya una buena forma de obtener una dirección de memoria real para un objeto en el depurador. Supongo que es por diseño, ya que es probable que la ubicación de un objeto en la memoria cambie durante la recolección de basura en una aplicación administrada. Por supuesto, puede declarar un bloque inseguro, fijar el objeto y agarrarlo con todos los operadores habituales de C / C ++. Entonces podrá ver el valor del puntero en el depurador. Sin embargo, no lo recomendaría como una buena costumbre: fijar objetos tiende a ensuciar con la capacidad del recolector de basura para mantener un montón ordenado, lo que a su vez puede llevar a un peor rendimiento y consumo de memoria.

Puede usar la Ventana Inmediata y usar Object.ReferenceEquals (obj1, obj2) para probar esto.

Creo que quieres la función System.Object.ReferenceEquals .