Есть ли встроенный способ идентификации экземпляров класса? - PullRequest
8 голосов
/ 26 августа 2010

Я веду некоторые диагностические журналы с одним из моих проектов на C # .NET, и я хотел бы иметь возможность регистрировать идентификатор, который представляет конкретный экземпляр класса. Я знаю, что мог бы сделать это с помощью статической переменной, которая просто увеличивается каждый раз, когда создается экземпляр класса, но мне просто интересно, есть ли какой-либо встроенный способ в .NET Framework для этого. Может быть, с помощью отражения или что-то.

Ответы [ 3 ]

8 голосов
/ 26 августа 2010

Вы можете добавить свойство Guid в свой класс и инициализировать его в конструкторе (гарантированно уникальное для каждого экземпляра).

6 голосов
/ 26 августа 2010

Просто чтобы добавить к тому, что Хенк сказал в своем ответе о GetHashCode, и смягчить некоторые отрицательные комментарии, которые он получил по этому ответу:

Существует способ вызвать GetHashCode для любого объекта, который не зависит от значения этого объекта, независимо от того, переопределен ли его тип GetHashCode.

Взгляните на System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode.

Конечно, это значение не обязательно должно быть уникальным. Также Guid (хотя для того, чтобы не был уникальным, требовались микроскопические шансы).

Я бы сказал, что ваш инстинкт был прав насчет статической переменной counter. Однако следует отметить, что простое увеличение его с помощью оператора ++ в конструкторе каждого объекта не является потокобезопасным. Если это возможно, вы можете создавать экземпляры класса из нескольких потоков, которые вы хотите использовать вместо Interlocked.Increment.

0 голосов
/ 26 августа 2010

Может быть Object.ReferenceEquals решит вашу проблему.По крайней мере, он может сказать вам, является ли объект тем же, что и какой-либо другой.

Вы не можете использовать статическую переменную, потому что она будет одинаковой в каждом случае.Он просто будет иметь количество созданных объектов.

У вас есть возможность использовать решение Джона Б. или если вы хотите, чтобы числовые идентификаторы использовали статический счетчик и присваивали идентификатор полю.

public class Foo
{
    static int counter;
    public int InstanceId;

    public Foo()
    {
        InstanceId = counter++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...