2009-07-13 25 views
1

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

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

回答

9

你只是想用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值的影响。

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

+0

非常感谢! – JaysonFix 2009-07-13 19:50:13

1

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

+0

这是绝对正确的 - 有没有简单的方法(我不知道有*任何*方式)来获取内存中的类的实际大小。不过,我认为OP只对单个领域的规模感兴趣。 – Noldorin 2009-07-13 19:49:43