2009-07-13 31 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