Как распечатать идентификатор объекта? - PullRequest
10 голосов
/ 18 апреля 2011

`Мне нужно знать, ссылаются ли две ссылки из совершенно разных частей программы на один и тот же объект.Я не могу сравнить ссылки программно, потому что они из другого контекста (одна ссылка не видна из другого и наоборот).

Затем я хочу напечатать уникальный идентификатор для каждого объекта, используя Console.WriteLine().Но метод ToString() не возвращает «уникальный» идентификатор, он просто возвращает «имя класса».

Можно ли напечатать уникальный идентификатор в C # (как в Java)?

Ответы [ 4 ]

18 голосов
/ 18 апреля 2011

Ближайший, который вы можете легко получить (на который не будут влиять движущиеся объекты GC и т. Д.), Вероятно, RuntimeHelpers.GetHashCode (Object) . Это дает хэш-код, который будет возвращен путем вызова Object.GetHashCode() не виртуально для объекта. Это все еще не уникальный идентификатор, хотя. Это, вероятно, достаточно хорошо для диагностических целей, но вы не должны полагаться на это для сравнения продукции.

РЕДАКТИРОВАТЬ: Если это только для диагностики, вы можете добавить своего рода «канонизирующий генератор идентификаторов», который был просто List<object> ... когда вы запрашиваете «идентификатор» объекта, вы проверяете, существует ли он уже в списке (путем сравнения ссылок), а затем добавьте его в конец, если это не так. Идентификатор будет индексом в списке. Конечно, выполнение этого без утечки памяти потребует слабых ссылок и т. Д., Но в качестве простого хака это может сработать для вас.

3 голосов
/ 18 апреля 2011

одна ссылка не видна из другой, и наоборот

Я не покупаю это. Если бы вы не могли даже получить ручки, как бы вы получили их удостоверения личности?

В C # вы всегда можете получить указатели на объекты и всегда можете их сравнить. Даже если для этого нужно использовать отражение.

1 голос
/ 18 апреля 2011

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

По умолчанию оператор == проверяет равенство ссылок,Это делается путем определения, указывают ли две ссылки на один и тот же объект.Поэтому ссылочные типы не должны реализовывать оператор == для получения этой функциональности.

Таким образом, оператор == сделает свое дело без обходного решения Id.

0 голосов
/ 18 апреля 2011

Я предполагаю, что вы звоните ToString по вашей ссылке object, но не совсем ясно, по этому или по вашему объясненному положению TBH, поэтому просто потерпите меня.

Имеет ли тип ID собственность?Если это так, попробуйте следующее:

var idAsString = yourObjectInstance.ID.ToString();

Или распечатайте напрямую:

Console.WriteLine(yourObjectInstance.ID);

РЕДАКТИРОВАТЬ:

IЯ вижу, что Джон видел сквозь эту проблему и заставляет мой ответ выглядеть довольно наивным - несмотря ни на что, я оставлю это, если только для того, чтобы подчеркнуть отсутствие ясности вопроса.А также, возможно, предоставьте путь для отказа на основании заявления Джона, что 'Этот [GetHashCode] все еще не является уникальным идентификатором' , если вы решите раскрыть свою уникальность с помощью идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...