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了下,并不会改变它实际的情况(封箱除外)
------解决思路----------------------
每个引用类型的对象在他的内存结构里面最上方有两块东西 一块叫同步锁 还有一块就是指向该类型的type