Question

Y at-il un C # équivalent à Python id () ? Sinon, comment puis-je vérifier si un objet a changé? Par exemple, en Python, un objet immuable:

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

et une mutable:

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

Modifier - La plupart des réponses à ce jour sont sur le fonctions de comparaison / opérateurs mais je suis plus intéressé par les valeurs qui sont comparées. à ce sujet, je n'étais pas clair au départ et j'accepte Object.ReferenceEquals comme la réponse.

Était-ce utile?

La solution

Eh bien, vous pouvez utiliser la fonction Object.ReferenceEquals() :

  

Détermine si les instances de Object spécifiées sont la même instance.

Pour emprunter votre exemple Python un peu:

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

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

equal sera true.

Autres conseils

Vous pouvez tester l'identité d'objet avec Object.ReferenceEquals .

Je pense que vous vous posez la mauvaise question. Ma réponse est assez détaillé, mais voici un rapide résumé:

  • Il n'y a pas d'équivalent direct id en C #.
  • Vous pouvez obtenir obtenir l'adresse d'un objet en C # en utilisant des pointeurs, mais vous ne devrait pas utiliser ce pour résoudre votre problème.
  • La méthode object.ReferenceEquals fait quelque chose de semblable à ce que vous essayez de faire.
  • Le problème que vous essayez de résoudre n'existe pas vraiment en C # de la même manière est-il fait en Python.
  • La façon dont vous utilisez id ne résout pas le problème en Python soit.

Tout d'abord, je vais poster de la documentation id depuis la plupart des gens ne semblent pas avoir lu. S'il vous plaît ne lire parce que le reste de ma réponse n'a de sens que si vous savez ce que id fait (et non, il ne crée pas un code de hachage):

  

Retour de la « identité » d'un objet. Ceci est un entier (ou entier long) qui est garanti d'être unique et constant pour cet objet au cours de sa vie. Deux objets avec des durées de vie qui ne se chevauchent peuvent avoir la même valeur id ().

     

CPython détail de mise en œuvre. Ceci est l'adresse de l'objet

C # ne dispose pas d'un équivalent à id mais il est possible d'obtenir l'adresse de l'objet en obtenant un pointeur vers l'objet en mode non sécurisé.

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

Cependant, vous ne devrait pas le faire en C #. Vous avez besoin très rarement d'utiliser le code dangereux en C #, et si vous le faites peut facilement se propager sous forme de code qui appelle votre code devient aussi dangereux. Il existe d'autres façons de résoudre votre problème qui ne nécessitent pas de code dangereux. En outre, dans .NET (contrairement à Python) les objets peuvent être déplacés en mémoire par le garbage collector, donc si vous voulez une seule identité qui reste constante pendant toute la durée de vie de l'objet, l'adresse de mémoire est d'aucune utilité pour vous. Vous devriez plutôt créer une propriété en lecture seule, appelée Id par exemple.


Une autre approche qui est possible en C # sans utiliser le code dangereux est de tester si deux variables ont la même référence en utilisant Object.ReferenceEquals . Cependant, vous ne devriez probablement pas faire non plus. C # ne pas la même ambiguïté que dans Python. Pour définir une variable pour pointer vers un nouvel objet que vous utilisez l'opérateur =. L'appel d'une méthode presque toujours ne changera pas la référence, vous ne devriez pas vous en inquiéter. En C # opérateur de x += y; est (presque) équivalente à x = x + y et vous ne pouvez pas changer cela comme vous pouvez en Python.


En outre, comme mentionné dans la documentation, votre exemple Python est viciée - id ne peut pas être utilisé de manière fiable pour tester si un objet a changé. Exemple:

>>> 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 vous devez comparer deux objets pour voir si elles sont le même objet (et vous ne devriez probablement pas faire cela) puis utilisez is qui est l'équivalent de Python object.ReferenceEquals. id n'est garanti d'être la constante pendant toute la durée d'un objet. Comme indiqué ci-dessus id est pas garantis différents pour des objets différents. En particulier, si l'un des objets n'existe plus, vous pouvez (et parfois vous) obtenir le même id en raison de la réutilisation de la même mémoire. En tant que tel l'utilisation de id est une très mauvaise idée ici.

Résumé

Ne pas le faire.

object.GetHashcode() peut-être vaut le coup.

WES, la bonne réponse à votre question, à savoir .. une fonction analogue à id () est

  

Object.GetHashCode ()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top