Вопрос

Есть ли эквивалент C# для Python я бы()? Если нет, как я могу проверить, изменился ли объект? Например, в Python неизменный объект:

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

и изменяемый:

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

Изменить - большинство ответов пока о Функции сравнения/операторы Но меня больше интересует значения, которые сравниваются. Я изначально не понял об этом, и я принимаю Object.ReferenceEquals как ответ.

Это было полезно?

Решение

Ну, вы можете использовать Object.ReferenceEquals() Функция:

Определяет, являются ли указанные экземпляры объекта одним и тем же экземпляром.

Немного позаимствовать пример питона:

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

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

equal будет true.

Другие советы

Вы можете проверить идентичность объекта с Object.ReferenceEquals.

Я думаю, вы задаете неправильный вопрос. Мой ответ довольно подробный, но вот краткое изложение:

  • Нет прямого эквивалента id в C#.
  • Вы можете получить адрес объекта в C#, используя указатели, но вы не должен использовать это Чтобы решить вашу проблему.
  • Метод object.ReferenceEquals Делает что -то похожее на то, что вы пытаетесь сделать.
  • Проблема, которую вы пытаетесь решить, на самом деле не существует в C# так же, как и в Python.
  • Как вы используете id Не решает проблему в Python.

Во -первых, я опубликую из Документация для ID Так как большинство людей, похоже, не читали это. Пожалуйста делать Прочитайте это, потому что остальная часть моего ответа имеет смысл только если вы знаете, что id делает (и нет, он не создает хэш -код):

Вернуть «идентичность» объекта. Это целое число (или длинное целое число), которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с непересекающимися временами жизни могут иметь одинаковое значение ID ().

Детали реализации CPYTHON: это адрес объекта.

C# не имеет эквивалента id Но можно получить адрес объекта, получив указатель на объект в небезопасном режиме.

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

Однако вы не должен этого делать в C#. Вам очень редко нужно использовать небезопасную код в C#, и если вы это сделаете, это может легко распространяться как код, который вызывает ваш код, также становится небезопасным. Есть и другие способы решить вашу проблему, которая не нуждается в небезопасном коде. Кроме того, в .net (в отличие от Python) объекты могут быть перемещены в памяти коллекционером мусора, поэтому, если вы хотите, чтобы единственная идентичность, которая остается постоянной для всего времени жизни объекта, адрес памяти не очень важен для вас. Вместо этого вы должны создать свойство Readonly, называемое Id Например.


Альтернативный подход, который возможен в C# без использования небезопасного кода, заключается в проверке, имеет ли две переменные одинаковую ссылку, используя Object.ReferenceEquals. Анкет Однако вы, вероятно, не должны этого делать. C# не имеет такой же двусмысленности, как в Python. Чтобы установить переменную, чтобы указывать на новый объект, который вы используете = оператор. Вызов метода почти всегда не изменит ссылку, поэтому вы не должны беспокоиться об этом. В C# x += y; оператор (почти) эквивалентен на x = x + y И вы не можете изменить это, как вы можете в Python.


Кроме того, как упомянуто в документации, ваш пример Python ошибочен - id нельзя использовать надежно, чтобы проверить, изменился ли объект. Пример:

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

В Python, если вам нужно сравнить два объекта, чтобы увидеть, являются ли они одним и тем же объектом (и, вероятно, не следует этого делать), затем используйте is который является эквивалентом питона object.ReferenceEquals. id гарантированно будет только постоянным в течение жизни объекта. Как показано выше id является нет Гарантированно будет отличаться для разных объектов. В частности, если один из объектов больше не существует, вы можете (а иногда и) получить то же самое id Из -за повторного использования той же памяти. Как таковое использование id Здесь действительно плохая идея.

Резюме

Не делай этого.

object.GetHashcode() Может быть, стоит попробовать.

Уэс, правильный ответ на ваш вопрос, т.е. аналогичная функция для id ()

object.gethashcode ()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top