2

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

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
        }
    }
4

2 回答 2

11

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

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

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

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

不过,这些差异可能无关紧要,具体取决于您的目的……我什至不确定是否可以在托管内存中获得确切的大小(或者至少不是没有很大的困难)。

于 2009-07-13T19:45:21.597 回答
1

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

于 2009-07-13T19:47:56.617 回答