2011-04-18 14 views
6

`Necesito saber si dos referencias de partes completamente diferentes del programa se refieren al mismo objeto. No puedo comparar las referencias programáticamente porque son del contexto diferente (una referencia no es visible desde otra y viceversa).¿Cómo imprimir la identificación del objeto?

Luego quiero imprimir el identificador único para cada objeto usando Console.WriteLine(). Pero el método ToString() no devuelve el identificador "único", simplemente devuelve "nombre de clase".

¿Es posible imprimir un identificador único en C# (como en Java)?

+1

¿Puedes dar un caso de uso donde esto tenga sentido? Tratar de comparar objetos sin sus referencias no tiene sentido. – Tejs

Respuesta

16

Lo más cerca que puede obtener fácilmente (que no se verá afectado por el GC moviendo objetos, etc.) es probablemente RuntimeHelpers.GetHashCode(Object). Esto le da al código hash que sería devuelto llamando al Object.GetHashCode() de forma no virtual en el objeto. Esto sigue siendo no un identificador único sin embargo. Probablemente sea lo suficientemente bueno para fines de diagnóstico, pero no debe confiar en él para las comparaciones de producción.

EDITAR: Si esto es solo para diagnósticos, podría agregar una especie de "generador de ID canonicalizador" que era solo un List<object> ... cuando solicite la "ID" de un objeto, podría verificar si ya existía en la lista (comparando referencias) y luego agréguela al final si no fue así. La identificación sería el índice en la lista. Por supuesto, hacer esto sin introducir una pérdida de memoria implicaría referencias débiles, etc., pero como un simple truco, esto podría funcionar para usted.

+0

¿La respuesta de Blindy no es correcta? ¿No es toda esta pregunta discutible? –

+0

@ Adam: Vea mi comentario sobre la respuesta de Blindy. Solo adivinando basado en la pregunta, pero tiene cierto sentido. –

+0

Ahh - eso tiene sentido. Gracias Jon. –

2

una referencia no es visible desde la otra y viceversa

Yo no compro eso. Si ni siquiera podía obtener los identificadores, ¿cómo obtendría sus identificaciones?

En C# siempre puedes obtener identificadores para objetos, y siempre puedes compararlos. Incluso si tiene que usar el reflejo para hacerlo.

+1

Sospecho que te estás perdiendo de qué manera el OP intenta diagnosticar un problema ... imprime una referencia de objeto de alguna descripción en un punto en el tiempo y luego imprime otra y luego las compara visualmente. En ningún punto de ese proceso, cualquier pieza de código tiene acceso a ambas referencias simultáneamente. Esa es mi suposición, de todos modos. –

+0

@Jon, siempre podría agregarlos a una lista "global" e inspeccionar el contenido de la lista en algún momento con 'object.Equals' si ese es su propósito. Sin embargo, admitiré que no había pensado en ninguna aplicación práctica de su problema <. < – Blindy

+0

Sí, eso era lo que mi edición sugería básicamente :) –

0

Supongo que está llamando ToString en su referencia object, pero no del todo claro en esta o en su situación explicada, TBH, así que ten paciencia.

¿El tipo expone una propiedad ID? Si es así, intente esto:

var idAsString = yourObjectInstance.ID.ToString(); 

O, imprimir directamente:

Console.WriteLine(yourObjectInstance.ID); 

EDIT:

veo Jon visto a través de este problema, y ​​hace que mi mirada respuesta bastante ingenuo, independientemente, lo dejo en nada más que para enfatizar la falta de claridad de la pregunta. Y también, tal vez, brinde una vía para bajar basándose en la declaración de Jon de que 'Esto [GetHashCode] aún no es un identificador único', si decide exponer su propia singularidad mediante un identificador.

1

Si necesita saber si dos referencias apuntan al mismo objeto, solo citaré this.

Por defecto, el operador == prueba la igualdad de referencia . Esto se hace por determinando si dos referencias indican el mismo objeto. Por lo tanto, los tipos de referencia no necesitan implementar el operador == para obtener esta funcionalidad de .

Por lo tanto, == operador hará el truco sin hacer la solución Id.

+2

"No puedo comparar referencias programáticamente" –

+0

Entonces mi respuesta es "No no es posible "A menos que crees un CustomId ei a GUID y los compares". O haga la solución GetHashCode() que dijo allí. – apacay

Cuestiones relacionadas