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 に答える