.NET反射:确定类字段的大小

时间:2009-07-13 19:41:17

标签: c# reflection field sizeof

目标:以编程方式确定类字段的大小(以字节为单位)。 例如,请参阅以下评论......

class MyClass
    {
    public  byte    b ;
    public  short   s ;
    public  int i ;
    }

class MainClass
    {
    public static void Main()
        {
        foreach ( FieldInfo fieldInfo
            in typeof(MyClass).GetFields(BindingFlags.Instance
             | BindingFlags.Public | BindingFlags.NonPublic) )
            Console.WriteLine ( fieldInfo.FieldType ) ;

        // output is:
        //    System.Byte
        //    System.Int16
        //    System.Int32

        // desired: to include "sizeof" each type (in bytes) ...
        //    System.Byte     1
        //    System.Int16    2
        //    System.Int32    4
        }
    }

2 个答案:

答案 0 :(得分:10)

您只想在System.Runtime.InteropServices命名空间中使用Marshal.SizeOf方法。

foreach (var fieldInfo in typeof(MyClass).GetFields(BindingFlags.Instance |
    BindingFlags.Public | BindingFlags.NonPublic))
{
    Console.WriteLine(Marshal.SizeOf(fieldInfo.FieldType));
}

请注意备注部分中的以下段落:

  

返回的大小实际上是非托管类型的大小。对象的非托管和托管大小可以不同。对于字符类型,大小受应用于该类的CharSet值的影响。

这些差异可能是无关紧要的,这取决于你的目的......我甚至不确定它是否可能在管理内存中获得确切的大小(或者至少没有很大的困难)。

答案 1 :(得分:1)

请注意,字段大小的总和不会总计任何给定类实例使用的内存量。 CLR用于各种目的的对齐填充和对象头信息,以及用于监视器支持的可能关联同步原语(C#中的lock关键字)将不属于总数。