Pregunta

¿Hay un equivalente de C# a Python's? identificación()? Si no, ¿cómo puedo probar si un objeto ha cambiado? Por ejemplo, en Python, un objeto inmutable:

>>> s = "abc"
>>> id(s)
11172320
>>> s += "d"
>>> id(s)
18632928

y uno mutable:

>>> a = [1, 2, 3]
>>> id(a)
11259656
>>> a += [4]
>>> id(a)
11259656

Editar: la mayoría de las respuestas hasta ahora son sobre Funciones de comparación/operadores Pero estoy más interesado en los valores que se están comparando. Inicialmente no estaba claro sobre eso, y estoy aceptando Object.ReferenceEquals como la respuesta.

¿Fue útil?

Solución

Bueno, puedes usar el Object.ReferenceEquals() función:

Determina si las instancias de objeto especificadas son la misma instancia.

Para tomar prestado su ejemplo de Python:

List<int> listA = new List<int> { 1, 2, 3 };
List<int> listB = listA;
listA.Add(4);

bool equal = object.ReferenceEquals(listA, listB);

equal estarán true.

Otros consejos

Puedes probar la identidad del objeto con Object.ReferenceEquals.

Creo que estás haciendo la pregunta equivocada. Mi respuesta es bastante detallada, pero aquí hay un resumen rápido:

  • No hay equivalente directo a id Cía#.
  • Puede obtener la dirección de un objeto en C# usando punteros, pero usted no debería usar esto Para resolver su problema.
  • El método object.ReferenceEquals hace algo similar a lo que estás tratando de hacer.
  • El problema que está tratando de resolver realmente no existe de la misma manera que lo hace en Python.
  • La forma en que estás usando id Tampoco resuelve el problema en Python.

En primer lugar, publicaré desde el Documentación para ID Dado que la mayoría de la gente no parece haberlo leído. Por favor hacer Lea esto porque el resto de mi respuesta solo tiene sentido si sabes qué id sí (y no, no crea un código hash):

Devuelve la "identidad" de un objeto. Este es un entero (o entero largo) que se garantiza que es único y constante para este objeto durante su vida. Dos objetos con vidas no superpuestas pueden tener el mismo valor id ().

Detalle de implementación de CPython: Esta es la dirección del objeto.

C# no tiene un equivalente a id Pero es posible obtener la dirección del objeto obteniendo un puntero al objeto en modo inseguro.

unsafe
{
     IntPtr x = (IntPtr)(&v);
     Console.WriteLine(x);
}

Sin embargo tu no debería hacer esto Cía#. Muy rara vez necesita usar un código inseguro en C#, y si lo hace, puede extenderse fácilmente como código que llama a su código también se vuelve inseguro. Hay otras formas de resolver su problema que no necesitan código inseguro. Además, los objetos .NET (a diferencia de Python) pueden moverse en la memoria por el recolector de basura, por lo que si desea una sola identidad que permanezca constante durante toda la vida del objeto, la dirección de memoria no es útil para usted. En su lugar, debe crear una propiedad Readonly, llamada Id por ejemplo.


Un enfoque alternativo que es posible en C# sin usar un código inseguro es probar si dos variables tienen la misma referencia usando Object.ReferenceEquals. Sin embargo, probablemente tampoco debería hacer esto. C# no tiene la misma ambigüedad que en Python. Para establecer una variable para apuntar a un nuevo objeto, usa el = operador. Llamar a un método casi siempre no cambiará la referencia, por lo que no debe preocuparse por ello. Cía# x += y; el operador es (casi) equivalente a x = x + y Y no puedes cambiar eso como puedes en Python.


Además, como se menciona en la documentación, su ejemplo de Python es defectuoso - id no se puede usar de manera confiable para probar si un objeto ha cambiado. Ejemplo:

>>> s='abc'
>>> id(s)
37822208
>>> s+='d'
>>> id(s)
61711680    # Changes
>>> s+='e'
>>> id(s)
61711680    # Oops... doesn't change even though the value changed.

En Python si tienes que comparar dos objetos para ver si son el mismo objeto (y probablemente no deberías estar haciendo esto), entonces usa is que es el equivalente de pitón de object.ReferenceEquals. id Solo se garantiza que es la constante durante la vida de un objeto. Como se muestra arriba id es no garantizado para ser diferente para diferentes objetos. En particular, si uno de los objetos ya no existe, puede (y a veces) obtendrá lo mismo id debido a la reutilización de la misma memoria. Como tal el uso de id es una muy mala idea aquí.

Resumen

No lo hagas.

object.GetHashcode() podría valer una oportunidad.

Wes, la respuesta correcta a su pregunta, es decir, una función análoga a id () es

Object.gethashCode ()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top