Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定实例的大小?_C#_.net_Unmanaged_Unsafe - Fatal编程技术网

C# 如何确定实例的大小?

C# 如何确定实例的大小?,c#,.net,unmanaged,unsafe,C#,.net,Unmanaged,Unsafe,我已将项目设置为接受不安全代码,并使用以下帮助器类来确定实例的大小: struct MyStruct { public long a; public long b; } public static class CloneHelper { public unsafe static void GetSize(BookSetViewModel book) { long n = 0;

我已将项目设置为接受不安全代码,并使用以下帮助器类来确定实例的大小:

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”不能作为非托管结构封送; 无法计算有意义的大小或偏移量

你知道我该怎么解决这个问题吗?
谢谢,

好吧,这取决于你所说的实例的“大小”。内存中有单个对象的大小,但通常需要考虑根对象引用的任何对象。这就是根目录符合垃圾收集条件后可回收的内存量。。。但是你不能只是把它们加起来,因为这些对象可能会被多个其他对象引用,事实上,甚至在单个对象中也可能有重复引用


显示了我以前用于确定原始对象(标题+字段)大小的一些代码,忽略了由于一个对象引用的对象而产生的任何额外成本。我不会在生产代码中使用它,但它对于在不同情况下测试对象的大小非常有用。

好吧,这实际上取决于实例的“大小”是什么意思。内存中有单个对象的大小,但通常需要考虑根对象引用的任何对象。这就是根目录符合垃圾收集条件后可回收的内存量。。。但是你不能只是把它们加起来,因为这些对象可能会被多个其他对象引用,事实上,甚至在单个对象中也可能有重复引用


显示了我以前用于确定原始对象(标题+字段)大小的一些代码,忽略了由于一个对象引用的对象而产生的任何额外成本。我不会在生产代码中使用它,但它对于在不同环境下测试对象的大小非常有用。

谢谢Jon。我需要粗略估计每个BookSetViewModel的大小(字节),并在每个选项卡上相应地显示它。以便客户了解当前图书的大小。我会把你发来的博客回复给你。许多的Thanks@Kave:但是,为什么客户会对此感兴趣?如果几本书都引用了同一个很长的作者姓名(作为一个字符串对象),那么是否应该包含该名称?客户对内存使用感兴趣似乎很奇怪,除非你真的在写剖析器。对不起,我的意思不是一本普通的书,而是一本交易术语的书。因此,每本书都是自动唯一的。我们有一些内存问题,好像客户加载了太多的书,内存被阻塞了(仍然是WinXp,内存限制为4GB)。因此,我需要用不同的颜色渲染选项卡(书所在的选项卡),警告用户打开的大书太多,他最好关闭一些。等等,希望它能让你sense@Kave:直接对象本身的大小对于所有对象都是相同的-因此听起来您实际上对对象中的数据感兴趣。我怀疑一个精确的数字在那里不会非常有用,但是如果你计算出什么占用了大量的数据(例如大数组和字符串),那么这应该会给出一个合理的“粗略估计”。每本书都有许多子选项卡(布局)。每个布局都有不同的列。但是每个布局的底层行都是相同的。我也可以计算行数,然后根据列数计算出一个测量值……谢谢Jon。我需要粗略估计每个BookSetViewModel的大小(字节),并在每个选项卡上相应地显示它。以便客户了解当前图书的大小。我会把你发来的博客回复给你。许多的Thanks@Kave:但是,为什么客户会对此感兴趣?如果几本书都引用了同一个很长的作者姓名(作为一个字符串对象),那么是否应该包含该名称?客户对内存使用感兴趣似乎很奇怪,除非你真的在写剖析器。对不起,我的意思不是一本普通的书,而是一本交易术语的书。因此,每本书都是自动唯一的。我们有一些内存问题,好像客户加载了太多的书,内存被阻塞了(仍然是WinXp,内存限制为4GB)。因此,我需要用不同的颜色渲染选项卡(书所在的选项卡),警告用户打开的大书太多,他最好关闭一些。等等,希望它能让你sense@Kave:直接对象本身的大小对于所有对象都是相同的-因此听起来您实际上对对象中的数据感兴趣。我怀疑一个精确的数字在那里不会非常有用,但是如果你计算出什么占用了大量的数据(例如大数组和字符串),那么这应该会给出一个合理的“粗略估计”。每本书都有许多子选项卡(布局)。每个布局都有不同的列。但是每个布局的底层行都是相同的。我也可以计算行数,然后根据列数计算出一个度量值。。。