【问题标题】:How to identify different instance of object?如何识别不同的对象实例?
【发布时间】:2012-01-04 23:22:35
【问题描述】:

假设我有这样的课程:

public class MyClass{
  public MyClass(){
    ...
  }
  ...
}

然后我可以创建一个类的实例,例如:

MyClass instance1 = new MyClass();

调试代码时,无论实例是什么,它总是经过相同的代码。如何确定实例是否与其他实例相同,尤其是对于某些 .NET 系统对象? 例如,WCF Ria Service 有一个基本类 DomainContext,我如何知道 DomainContext 的实例对于应用程序是新的还是相同的?

【问题讨论】:

  • 您是否在比较两个实例以查看它们是否相同?
  • 您是否希望能够以编程方式确定两个引用是否不相同?或者在调试器中,您如何在实例方法中判断您正在处理哪个实例?
  • 如果您只想为调试器标记引用(并且不想添加到您的类型的内存占用或使用您无法控制的类型),那么有一个答案在 SO:stackoverflow.com/questions/4251450/…

标签: c# wcf-ria-services


【解决方案1】:

如果您的问题是如何在实例方法中判断您正在查看哪个引用,您可以将 this 添加到您的监视列表中,然后右键单击监视列表条目并选择“生成对象 ID”,这将使用唯一 ID 标记引用。

按照这个类似的 SO 问题中的步骤操作:Identifying Unique References in Debugger

如果您的问题是如何判断两个引用是否相同,您可以使用 ReferenceEquals() 来比较它们(或 ==,如果您知道它没有为该类型重载)。

【讨论】:

  • 观察列表中添加的唯一ID是否与默认的toString() and hashCode()`相关?
【解决方案2】:

出于调试目的,您可以像这样简单地对实例进行编号:

public class MyClass{
  private static int instanceCounter = 0;

  private int instanceNumber;

  public MyClass(){
        instanceNumber = Interlocked.Increment(instanceCounter);
  }
  ...
}

【讨论】:

  • 顺便说一下,++ 不是线程安全的。你会想要一个联锁的增量。
  • 其实我不会用lock,只是持有增量比较重,使用Interlocked.Increment()的返回值,它返回新值:public MyClass() { instanceNumber = Interlocked.Increment(ref instanceCounter); }
  • 这当然可行,但它确实为类增加了内存空间,如果他只想将它们分开以进行调试,那可能是矫枉过正。如果他想为整个程序唯一标识它们,这很好,但如果他只想标识它们以进行调试,我只需使用对象 ID。
  • @JamesMichaelHare 这样做的缺点是它不会自动出现在监视列表中。
【解决方案3】:

所有实例都有某种标识符。在一个正确实现的类(或一个不覆盖散列函数的类)中,获取散列码将指示实例是相同还是不同。在某些情况下,对象的默认字符串表示将由类名和特定实例的标识符组成。只需将实例打印到控制台就足以区分实例。

【讨论】:

  • 怎么样?每个实例仍然有一个对象标识符,这就是@James 在他的回答中所指的。
猜你喜欢
  • 2015-01-25
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多