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?
Respuesta
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
.
Interesante enlace. –
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.
¿GetHashcode cambia de una instancia a otra? No debería cambiar si los objetos son iguales entre sí. – Zebi
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. –
@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. –
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++;
}
}
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 '). –
Se podría añadir una propiedad Guid
a su clase de una inicializar en el constructor (garantizado único para cada instancia).
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
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. –
¿Cómo usarías un contador estático? Será lo mismo en cada caso, ya que es estático. ¿Estoy equivocado? – Zebi
- 1. ¿Existe una forma integrada de dividir cadenas en C++?
- 2. ¿Contando instancias de una clase?
- 3. ¿Una forma "elegante" de identificar un campo?
- 4. Identificar de forma única una computadora
- 5. ¿Existe alguna forma programática para identificar palabras reservadas de C#?
- 6. Conseguir todas las instancias de una clase
- 7. ¿Existe una manera simple de comparar instancias de BufferedImage?
- 8. ¿Existe una manera fácil/integrada de obtener una copia exacta (clon) de un elemento XAML?
- 9. ¿Existe una forma estándar de organizar métodos dentro de una clase?
- 10. C++: ¿alguna forma de evitar la creación de instancias de una clase base abstracta?
- 11. ¿Cómo identificar si la referencia de clase es una interfaz?
- 12. ¿Existe una manera simple de obtener todas las instancias de objeto de una clase específica en Java
- 13. ¿Cómo identificar si existe un índice Lucene.Net en una carpeta?
- 14. ¿Limita la creación de instancias de una clase?
- 15. Ordenar una lista de instancias de clase Python
- 16. Obtenga todas las instancias de una clase en PHP
- 17. sintaxis extraño para crear instancias de una clase interna
- 18. ¿Debería una clase C# generar instancias de sí mismo?
- 19. Obtenga una lista de las instancias en una clase de tipo en Haskell
- 20. crear instancias de clase personalizada de NSDictionary
- 21. ¿Existe una forma estándar de representar fechas inciertas en C#?
- 22. ¿Existe una "forma más rápida" de construir cadenas en Java?
- 23. ¿Existe una herramienta de refactorización para Eclipse mejor que la integrada?
- 24. cómo agregar una variable miembro y métodos a una clase integrada sin crear subclases
- 25. ¿Existe una forma estable de detectar el evento de temblor?
- 26. ¿Existe una forma estándar de seguimiento de auditoría en griales?
- 27. ¿Existe alguna forma mejor de manejar una excepción de conversión?
- 28. ¿Cómo identificar una clase y una interfaz en el código de Java?
- 29. ¿Existe alguna forma mejor de crear una clase orientada a objetos con jquery?
- 30. Forma rápida de validar XML/Identificar punto de quebranto
La discusión en esta pregunta puede ayudarlo. http://stackoverflow.com/questions/750947/net-unique-object-identifier –