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),导致每次地址不一样。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值