When .GetType()
method is called upon an object, how does C# know its type? What if the object is identical to some other object type in the same project? Do they have some sort of unique identification (like GUID) baked into them?
2 回答
当对象上调用 .GetType() 方法时,C# 如何知道它的类型?
除了内存位置之外,CLR 实际上还存储每个对象的类型信息。
这存储在TypeHandle
. 有关详细信息,请参阅深入了解.NET Framework 内部结构以了解 CLR 如何创建运行时对象,尤其是类型基础部分。
当您调用Object.GetType()
一个对象时,CLR 会根据对象引用中的 TypeHandle 进行查找,并返回适当的类型。
当对象上调用 .GetType() 方法时,C# 如何知道它的类型?
每当执行一个方法时,CLR 都会在方法内部创建一个所有类型的静态元数据列表,每个类型都引用了它们的 Type 对象。
创建对象时(如使用new
运算符),CLR 在堆中分配对象时添加一个 Type 对象指针,并将此指针指向静态 Type 对象,该对象包含类型名称、命名空间等信息,它定义的方法和属性列表等。
当GetType
在对象上调用它时,它只是返回其 Type 对象指向的引用,这就是为什么即使将实例存储到另一个object
类型的变量中也会保持对其原始类型(创建它的类型)的正确引用。
如果对象与同一项目中的某些其他对象类型相同怎么办?
对象的类型由其名称、名称空间和程序集定义。你不能在同一个命名空间中有两个同名的类,因为编译器会抱怨Duplicate definition
. 但是,只要它们驻留在不同的命名空间中,System.Foo.Bar
它们System.Bar
就可以共存。