2010-08-25 10 views
8

Estoy haciendo un registro de diagnóstico con uno de mis proyectos C# .NET y me gustaría poder registrar un identificador que represente una instancia específica de una clase. Sé que podría hacer esto con una variable estática que simplemente se incrementa cada vez que se crea una instancia de clase, pero me pregunto si hay alguna forma incorporada en .NET Framework para hacerlo. Tal vez usando el reflejo o algo así.¿Existe una forma integrada de identificar instancias de una clase?

+0

La discusión en esta pregunta puede ayudarlo. http://stackoverflow.com/questions/750947/net-unique-object-identifier –

Respuesta

5

sólo para añadir a lo Henk said in his answer sobre GetHashCode, y para mitigar algunos de los comentarios negativos que recibió en esa respuesta:

Hay una manera de llamar GetHashCode en cualquier objeto que es independiente del valor de ese objeto , independientemente de si su tipo ha reemplazado o no GetHashCode.

Eche un vistazo a System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode.

Este valor no está garantizado para ser único, por supuesto. Tampoco es un Guid (aunque para eso no para ser exclusivo implicaría probabilidades que son legítimamente microscópicas).

Diría que su instinto tenía razón acerca de la variable del contador estático. Debo mencionar, sin embargo, que simplemente incrementándolo usando el operador ++ en el constructor de cada objeto no es seguro para subprocesos. Si es posible, podría crear instancias de instancias de una clase a partir de varios hilos en los que le gustaría usar Interlocked.Increment.

+0

Interesante enlace. –

3

Lo más cercano es GetHashCode(), pero no se garantiza que sea único. Por lo general, sería suficiente para el diagnóstico.

Acabo de leer las respuestas a este similar question. De acuerdo con JS, existe la sobrecarga de asignar un bloque de sincronización para la primera llamada a GethashCode. Eso podría ser un problema.

+0

¿GetHashcode cambia de una instancia a otra? No debería cambiar si los objetos son iguales entre sí. – Zebi

+2

Dos instancias de la misma clase inicializada con los mismos valores tendrían que devolver el mismo código hash, por lo que esto realmente no funcionaría en absoluto. –

+1

@Jon B: Eso solo es cierto para algunas clases (como cadena) que anula GethashCode(). La versión predeterminada es parte de System.Object y no puede ver a sus miembros. Intentalo. –

0

Quizás Object.ReferenceEquals resuelva su problema. Al menos puede decirle si un objeto es igual a otro.

No puede usar una variable estática porque será la misma en cada caso. Simplemente tendrá el recuento de los objetos creados.

Tiene la posibilidad de utilizar la solución de Jon B o si desea que los identificadores numéricos utilicen un contador estático y asigne una identificación a un campo.

public class Foo 
{ 
    static int counter; 
    public int InstanceId; 

    public Foo() 
    { 
     InstanceId = counter++; 
    } 
} 
+0

Estoy bastante seguro de que lo que describes en tu última parte es exactamente lo que el OP significaba con "variable estática" (que sería 'contador '). –

7

Se podría añadir una propiedad Guid a su clase de una inicializar en el constructor (garantizado único para cada instancia).

+2

Usó esta técnica algunas veces. Puede inicializar directamente un campo 'public Guid InstanceId = Guid.NewGuid();' para mantener su constructor limpio de cosas de depuración. – Zebi

+0

Eso no es mucho más fácil o más conveniente que usar un contador estático. Es mucho más difícil para los ojos. –

+0

¿Cómo usarías un contador estático? Será lo mismo en cada caso, ya que es estático. ¿Estoy equivocado? – Zebi

Cuestiones relacionadas