我已将项目设置为接受不安全的代码,并使用以下帮助程序类来确定实例的大小:
struct MyStruct
{
public long a;
public long b;
}
public static class CloneHelper
{
public unsafe static void GetSize(BookSetViewModel book)
{
long n = 0;
MyStruct inst;
inst.a = 0;
inst.b = 0;
n = Marshal.SizeOf(inst);
}
}
这与结构完美搭配。但是,只要我使用传入的实际类实例:
public unsafe static void GetSize(BookSetViewModel book)
{
long n = 0;
n = Marshal.SizeOf(book);
}
我收到此错误:
类型'BookSetViewModel'不能作为非托管结构封送; 没有有意义的大小或偏移量可以计算出来。
知道如何解决这个问题吗? 谢谢,
答案 0 :(得分:3)
嗯,这实际上取决于你的实例的“大小”是什么意思。内存中有单个对象的大小,但通常需要考虑根对象引用的任何对象。在根变得有资格进行垃圾收集之后,可以可以回收多少内存...但是你不能只是添加它们,因为这些对象可能被多个其他>引用 em>对象,甚至在单个对象中也可能存在重复引用。
This blog post显示了我之前用来确定原始对象(标题+字段)大小的一些代码,忽略了由于一个对象引用的对象而导致的任何额外成本。这不是我在生产代码中使用的东西,但它可以用来试验在不同情况下对象的大小。