【问题标题】:Is there a built in way to identify instances of a class?是否有内置方法来识别类的实例?
【发布时间】:2011-04-03 22:37:45
【问题描述】:

我正在使用我的一个 C#.NET 项目进行一些诊断日志记录,并且我希望能够记录一个表示类的特定实例的标识符。我知道我可以使用一个静态变量来执行此操作,该变量每次创建类实例时都会递增,但我只是想知道 .NET 框架中是否有任何内置方法可以执行此操作。也许使用反射或其他东西。

【问题讨论】:

标签: c# .net class instance


【解决方案1】:

您可以将Guid 属性添加到您的类并在构造函数中对其进行初始化(保证每个实例都是唯一的)。

【讨论】:

  • 多次使用这种技术。你可以直接初始化一个字段public Guid InstanceId = Guid.NewGuid(); 来保持你的构造函数没有调试的东西。
  • 这并不比使用静态计数器更容易或更方便。这对眼睛来说更难。
  • 如何使用静态计数器?由于它是静态的,因此在每个实例中都是相同的。我弄错了吗?
  • @Zebi - static int s_counter = 0; 然后int id = s_counter++;。每个对象将按顺序编号,不重复。
  • @Zebi, @Henk - 使用 Guid 只是稍微容易一点,但正如 Henk 所说,它更难阅读。这里唯一的优点是Guid 在所有对象中都是唯一的,而不仅仅是同一类的实例。当然,如果你真的想要,你也可以为此创建一个静态计数器。
【解决方案2】:

只是为了补充Henk said in his answer 关于GetHashCode 的内容,并减轻他在该答案中收到的一些负面评价:

有一种方法可以在独立于该对象值的任何对象上调用GetHashCode,无论其类型是否已覆盖GetHashCode

看看System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode

当然,这个值不能保证是唯一的。 Guid 也不是(尽管 不是 是唯一的,这将涉及合法微观的可能性)。

我想说你对静态计数器变量的直觉是正确的。不过,我应该提一下,在每个对象的构造函数中使用 ++ 运算符简单地递增它不是线程安全的。如果有可能,您可以从多个线程中实例化一个类的实例,您可能希望改用 Interlocked.Increment

【讨论】:

    【解决方案3】:

    也许Object.ReferenceEquals 可以解决您的问题。至少它可以告诉您一个对象是否与其他对象相同。

    您不能使用静态变量,因为它在每个实例中都是相同的。它只会包含创建的对象的数量。

    您可以使用 Jon B 的解决方案,或者如果您希望数字标识符使用静态计数器并将 id 分配给字段。

    public class Foo
    {
        static int counter;
        public int InstanceId;
    
        public Foo()
        {
            InstanceId = counter++;
        }
    }
    

    【讨论】:

    • 我很确定您在上一部分中所描述的正是 OP 所指的“静态变量”(即counter)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多