【问题标题】:(How) does C# know what type the object is?(如何)C# 知道对象是什么类型?
【发布时间】:2013-06-02 21:24:16
【问题描述】:

.GetType()方法被一个对象调用时,C#如何知道它的类型?如果对象与同一项目中的某些其他对象类型相同怎么办?它们是否具有某种独特的标识(如 GUID)?

【问题讨论】:

  • 不一样的名字意味着它是一个不同的类型。
  • 那么它在不同的程序集中,是不同的类型。
  • @user1306322 类型名称无关紧要 - 它是对象本身的完整 Type,它始终是唯一的,因为它固有地包含程序集信息。
  • 你的第二个问题是无稽之谈;如果你有 两个 的东西彼此 相同 那么你实际上只有 一个 的东西。这就是相同的意思;这意味着两个事物具有相同的身份,因此是相同的事物。 “同卵双胞胎”真的应该叫“同卵双胞胎”;他们不共享身份。
  • @EricLippert OP 显然没有意识到所有对象实例都存储有关其类型的信息,而只是存储它们的成员,因此他(错误地)假设两个对象实例具有相同的字段,甚至如果他们来自不同的班级,看起来真的会一样。 C# 如何通过专门存储有关每个实例与该对象数据的类的信息来解决这个问题。这就是 OP 的“缺失的部分”。

标签: c# types gettype object-type


【解决方案1】:

当一个对象调用.GetType()方法时,C#如何知道它的类型?

除了内存位置之外,CLR 实际上存储每个对象的类型信息。

这存储在TypeHandle 中。有关详细信息,请参阅Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects,尤其是Type Fundamentals 部分。

当您在对象上调用Object.GetType() 时,CLR 会根据对象引用中的 TypeHandle 进行查找,并返回适当的类型。

【讨论】:

    【解决方案2】:

    当一个对象调用.GetType()方法时,C#如何知道它的类型?

    每当执行一个方法时,CLR 都会创建一个在方法内引用的所有类型的静态元数据的列表,每个类型都有一个对其 Type 对象的引用。

    创建对象时(例如使用new 运算符),CLR 在堆中分配对象时添加一个 Type 对象指针,并将该指针指向静态 Type 对象,其中包含名称等信息类型、命名空间、它定义的方法和属性列表等。

    当在对象上调用 GetType 时,它只返回其 Type 对象指向的引用,这就是为什么即使将实例存储到另一个 object 类型的变量中也会保持对其原始类型的正确引用(它的类型被创建为)。

    如果对象与同一项目中的某些其他对象类型相同怎么办?

    对象的类型由其名称、名称空间和程序集定义。在同一个命名空间中不能有两个同名的类,因为编译器会报错Duplicate definition。但是,只要它们位于不同的命名空间中,System.Foo.BarSystem.Bar 就可以共存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2012-09-04
      • 2015-03-11
      相关资源
      最近更新 更多