C#知识系列:获取一个对象的内存地址

C#的对象类型分为两种:值类型与引用类型

两种打印地址的方式不一样

值类型:

unsafe void PrintValueTypeObjectAddress()
{
   Vector2 v1 = new Vector2();
   Vector2* pV1 = &v1;
   Debug.Log((int)pV1);
} 

引用类型:

 public static unsafe void PrintReferenceTypeObjectAddress(object o)
{
    GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
    IntPtr addr = h.AddrOfPinnedObject();
    Debug.Log("0x" + addr.ToString("X"));
}

        引用类型中的GCHandleType为什么需要用GCHandleType.Pinned呢(网上很多博客都没有说明,有的甚至用的别的类型),可以参考《C#知识系列:GCHandleType的作用》,是为了不让GC对象移位,如果你用别的GCHandleType,对同一个对象进行两次地址的打印,发现是不一样的(具体为什么运行过程中GC内存地址进行移位了,暂时也不太清楚,得去深挖Mono的GC机制才行)。

        另外,也不要对值类型使用PrintReferenceTypeObjectAddress的方式来打印地址,它会进行装箱操作(值类型封装成object),导致每次地址不一样。

猜你喜欢

转载自blog.csdn.net/qq1090504117/article/details/111676719