Frage

Gibt es ein C#, das Python entspricht? Ich würde()? Wenn nicht, wie kann ich testen, ob sich ein Objekt geändert hat? Zum Beispiel in Python ein unveränderliches Objekt:

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

und eine veränderliche:

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

Bearbeiten - Die meisten Antworten bisher handeln Vergleichsfunktionen/Operatoren Aber ich interessiere mich mehr für die Werte, die verglichen werden. Das war mir anfangs nicht klar und akzeptiere ich Object.ReferenceEquals als Antwort.

War es hilfreich?

Lösung

Nun, Sie können die verwenden Object.ReferenceEquals() Funktion:

Bestimmt, ob die angegebenen Objektinstanzen dieselbe Instanz sind.

Um Ihr Python -Beispiel ein wenig auszuleihen:

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

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

equal wird sein true.

Andere Tipps

Sie können die Objektidentität mit testen Object.ReferenceEquals.

Ich denke, Sie stellen die falsche Frage. Meine Antwort ist ziemlich detailliert, aber hier ist eine kurze Zusammenfassung:

  • Es gibt kein direktes Äquivalent zu id in C#.
  • Sie können die Adresse eines Objekts in C# mit Zeigern erhalten, aber Sie sollte das nicht benutzen um Ihr Problem zu lösen.
  • Die Methode object.ReferenceEquals Tut etwas Ähnliches wie das, was Sie versuchen zu tun.
  • Das Problem, das Sie lösen möchten, existiert in C# nicht wirklich auf die gleiche Weise in Python.
  • Die Art, wie Sie verwenden id Löst das Problem auch in Python auch nicht.

Erstens werde ich aus dem posten Dokumentation für ID Da scheinen die meisten Menschen es nicht gelesen zu haben. Bitte tun Lesen Sie dies, weil der Rest meiner Antwort nur sinnvoll ist, wenn Sie wissen, was id tut (und nein, es erstellt keinen Hash -Code):

Gibt die „Identität“ eines Objekts zurück. Dies ist eine Ganzzahl (oder eine lange ganze Zahl), die für dieses Objekt während seiner Lebensdauer garantiert einzigartig und konstant ist. Zwei Objekte mit nicht überlappenden Lebensdauer können den gleichen ID () -Wert haben.

CPython -Implementierungsdetail: Dies ist die Adresse des Objekts.

C# hat kein Äquivalent zu id Es ist jedoch möglich, die Adresse des Objekts zu erhalten, indem ein Zeiger auf das Objekt im unsicheren Modus geliefert wird.

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

Aber du sollte das nicht tun in C#. Sie müssen sehr selten einen unsicheren Code in C#verwenden. Wenn Sie dies tun, kann dies leicht als Code verbreiten, der Ihren Code auch unsicher wird. Es gibt andere Möglichkeiten, Ihr Problem zu lösen, die keinen unsicheren Code benötigen. Außerdem können in .NET (im Gegensatz zu Python) Objekte vom Müllkollektor im Speicher bewegt werden. Wenn Sie also eine einzelne Identität wünschen, die für die gesamte Lebensdauer des Objekts konstant bleibt, ist die Speicheradresse für Sie nicht nützlich. Sie sollten stattdessen eine Readonly -Eigenschaft erstellen, die genannt wird Id zum Beispiel.


Ein alternativer Ansatz, der in C# möglich ist, ohne einen unsicheren Code zu verwenden Object.ReferenceEquals. Sie sollten dies jedoch auch nicht tun. C# hat nicht die gleiche Mehrdeutigkeit wie in Python. So setzen Sie eine Variable, die auf ein neues Objekt verweist, das Sie verwenden = Operator. Wenn Sie eine Methode aufrufen, wird die Referenz fast immer nicht geändert, sodass Sie sich darüber keine Sorgen machen sollten. In C# x += y; Der Bediener ist (fast) gleichwertig zu x = x + y Und Sie können das nicht ändern wie in Python.


Wie in der Dokumentation erwähnt, ist Ihr Python -Beispiel auch fehlerhaft - id kann nicht zuverlässig verwendet werden, um zu testen, ob sich ein Objekt geändert hat. Beispiel:

>>> 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.

In Python, wenn Sie zwei Objekte vergleichen müssen, um festzustellen, ob es sich um das gleiche Objekt handelt (und Sie sollten dies wahrscheinlich nicht tun), dann verwenden Sie dann is Welches ist das Pythonäquivalent von object.ReferenceEquals. id ist nur garantiert die Konstante über die Lebensdauer eines Objekts. Wie oben gezeigt id ist nicht garantiert für verschiedene Objekte unterschiedlich. Insbesondere wenn eines der Objekte nicht mehr existiert, können (und manchmal) dasselbe bekommen id aufgrund der Wiederverwendung des gleichen Speichers. Als solcher die Verwendung von id ist hier eine wirklich schlechte Idee.

Zusammenfassung

Tu es nicht.

object.GetHashcode() könnte einen Schuss wert sein.

Wes, die richtige Antwort auf Ihre Frage, dh eine analoge Funktion zu id () ist

Object.GethashCode ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top