我正在使用我的一个C#.NET项目进行一些诊断日志记录,我希望能够记录代表一个特定类的实例的标识符。我知道我可以用一个静态变量做到这一点,每次创建一个类实例时它都会增加,但我只是想知道在.NET框架中是否有任何内置方法来执行此操作。也许使用反射或其他东西。
答案 0 :(得分:8)
您可以在类中添加Guid
属性,并在构造函数中对其进行初始化(保证每个实例都是唯一的)。
答案 1 :(得分:6)
只需添加Henk said in his answer关于GetHashCode
的内容,并减轻他在该答案中收到的一些负面评论:
有一种方法可以在任意对象上调用GetHashCode
,该对象独立于该对象的值,无论其类型是否已覆盖GetHashCode
。
看看System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode
。
当然,此值不保证是唯一的。也不是Guid
(虽然不是唯一的会涉及合法微观的赔率)。
我会说你的直觉是关于静态计数器变量的。但是,我应该提一下,在每个对象的构造函数中使用++
运算符简单地递增它不是线程安全的。如果您可以从多个线程实例化一个类的实例,那么您可能希望使用Interlocked.Increment
。
答案 2 :(得分:0)
也许Object.ReferenceEquals
可以解决您的问题。至少它可以告诉你一个物体是否与其他物体相同。
您不能使用静态变量,因为它在每个实例中都是相同的。它只会创建对象的计数。
您可以使用Jon B的解决方案,或者如果您希望数字标识符使用静态计数器并为字段分配ID。
public class Foo
{
static int counter;
public int InstanceId;
public Foo()
{
InstanceId = counter++;
}
}