2010-11-22 7 views
36

Vengo de un fondo C++, así que me disculpo si esto no es una forma de pensar de C#, pero solo necesito saberlo. :)Identificación única de tipos de referencia en el depurador

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 están apuntando a la misma 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í?

Respuesta

67

Lo que está buscando son id 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 - Ejecutar este código

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

Paso 1 - Haga clic derecho y seleccionar "Hacer que el objeto Id"

alt text

Paso 2 - Las instancias se muestran ahora con el 1 # sufijo. Nota: no hice nada especial en este paso. Inmediatamente después de hacer clic en "Hacer Id. De objeto" se actualizaron las filas para mostrar el sufijo 1 #, ya que se refieren a la misma instancia.

alt text

Paso 3 - Véase en cualquier momento mediante la adición de 1 # para la ventana de inspección

alt text

+7

Eso es genial, nunca he oído hablar de identificaciones de objeto. Tantas pequeñas cosas como esta que están 'ocultas' en VS. –

+0

Salsa impresionante. Gran explicación y visuales sexys. +1 y una respuesta correcta. :) –

+0

Ahora, si hubiera una forma de hacerlo en MonoDevelop ... –

3

En proyectos C#, si hace clic 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.

Cuestiones relacionadas