none
关于Object对象类型的长度问题 RRS feed

  • 问题

  • 看过一些资料,据说,Object型数据用来保存引用对象的地址,Object型数据是可以指向任意数据类型的数据,以4个字节存储。我想验证一下这4个字节,于是使用了以下语句:

     Dim a As Object = New Integer
      Label1.Text = Len(a)

    实际上所获取的长度与New后面的类型有关,难道我的思路错了?

    如果写成这样:

     Dim a As Object = New Button
     Label1.Text = Len(a)

    则出错。

    请问这4个字节如何得知?

    2016年3月21日 1:52

答案

  • VB.Net中的Len是Strings的成员函数,他接受装箱后的值对象。

    总结下.Net对于对象大小的获取:

    非托管类型你可以用 Marshal.SizeOf(object yourObj)

    值类型你可以用 Len() 或者C#中的 sizeof()

    但是托管应用类型,就不那么简单了,我找到过用binary序列化来查看序列化后对象长度的方法:

    Dim size As Long = 0
    Dim o As New Object()
    Using s As Stream = New MemoryStream()
    	Dim formatter As New BinaryFormatter()
    	formatter.Serialize(s, o)
    	size = s.Length
    End Using

    但此方法仅限于可序列化类型。

    也有网友分享过用GC来看对象大小的:https://blogs.msdn.microsoft.com/mab/2006/04/25/how-to-determine-size-of-net-managed-object-in-memory-like-a-sizeof-for-reference-types/


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已标记为答案 shellyqiu 2016年3月28日 3:04
    2016年3月21日 2:32
    版主

全部回复

  • VB.Net中的Len是Strings的成员函数,他接受装箱后的值对象。

    总结下.Net对于对象大小的获取:

    非托管类型你可以用 Marshal.SizeOf(object yourObj)

    值类型你可以用 Len() 或者C#中的 sizeof()

    但是托管应用类型,就不那么简单了,我找到过用binary序列化来查看序列化后对象长度的方法:

    Dim size As Long = 0
    Dim o As New Object()
    Using s As Stream = New MemoryStream()
    	Dim formatter As New BinaryFormatter()
    	formatter.Serialize(s, o)
    	size = s.Length
    End Using

    但此方法仅限于可序列化类型。

    也有网友分享过用GC来看对象大小的:https://blogs.msdn.microsoft.com/mab/2006/04/25/how-to-determine-size-of-net-managed-object-in-memory-like-a-sizeof-for-reference-types/


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已标记为答案 shellyqiu 2016年3月28日 3:04
    2016年3月21日 2:32
    版主
  • 非常感谢!
    2016年3月28日 3:04