2009-07-13 2 views
1

目的:クラスのフィールドのサイズ(バイト単位)をプログラムで決定する。例えば 、以下のコメントを参照....NET Reflection:クラスのフィールドのサイズを決定する

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

あなたは単に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値の影響を受けます。

これらの違いは、私はそれが(または少なくともない大きな困難なし)管理メモリ内の正確なサイズを取得する可能性がありますさえわからない...あなたの目的に応じて、しかし、おそらく取るに足らないです。

+0

ありがとうございます! – JaysonFix

1

フィールドのサイズの合計が、指定されたクラスインスタンスによって使用されたメモリの合計ではないことに注意してください。様々な目的のためにCLRで使用される整列フィラーとオブジェクトヘッダー情報、およびモニターサポートのための関連する可能性のある同期プリミティブ(C#のlockキーワード)は、合計に含まれません。

+0

これは絶対に当てはまります - メモリ内のクラスの実際のサイズを取得するには簡単な方法はありません。しかし、OPは個々のフィールドのサイズに興味があると思う。 – Noldorin

+1

完全に移植可能な方法はありませんが、プロセスメモリとインスタンス数の関係に基づく推定が最適です。しかし、このような質問では、フィールドのサイズ - 私は通常の疑いで終了します。それは当初から変わったように聞こえる... :) –

+0

@バリー:うん、まさに...あなたはそこに暗い領域に入っている。 – Noldorin

関連する問題