当前位置: 代码迷 >> C# >> 求答疑 object 基类的GetType() 是依据什么得到的结果
  详细解决方案

求答疑 object 基类的GetType() 是依据什么得到的结果

热度:94   发布时间:2016-05-05 03:10:11.0
求答疑 object 基类的GetType() 是根据什么得到的结果

dynamic dyn = (object)(new int[] { 1, 2, 3, 4, 5, 6, 7 });
object obj = new int[] { 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine(dyn.GetType());
Console.WriteLine(obj.GetType());


代码如上
之前也没有怎么在意 ,昨天突然有了疑惑
既然编译的时候 obj  我已经定义为object 类型了  那在运行时clr是怎么判断出 obj  就是Int32[]类型的数据
最初我是这样想的在托管堆里obj  指向的对象除了存放数据内容还存放了数据类型
为了证明自己的想法  用winhex打开程序的内存看了下。好像自己定义的对象在内存里没有添加什么特殊的标识
所有自己的这个想法应该是错的。

还问题就来了  我已经指定obj  就是object    ,而且内存里数据本身也不知道自己是什么类型。 
但运行时CLR到底是靠什么得知数据的原始Type的


求解答
------解决思路----------------------
object obj = ...
是一个引用,该引用指向类似如下布局:

--> 4个字节的同步块/Hash值
    4个字节指向类型定义
    类的数据...


你可以看到,应用指向的数据中,有类型定义。CLR可以通过类型定义,来进行类型判断,函数调用等等。

注:上述布局不一定准确,微软为了将来的优化和升级,不公开和保证如上布局,以方便修改。
但是可以肯定,引用指向的数据中,会有类型定义。
------解决思路----------------------
在托管堆里面有一部分区域指向该对象是什么数据类型的,哎这东西又忘了,object了下,并不会改变它实际的情况(封箱除外)
------解决思路----------------------
引用:
在托管堆里面有一部分区域指向该对象是什么数据类型的,哎这东西又忘了,object了下,并不会改变它实际的情况(封箱除外)

每个引用类型的对象在他的内存结构里面最上方有两块东西 一块叫同步锁 还有一块就是指向该类型的type
  相关解决方案