目标:以编程方式确定类字段的大小(以字节为单位)。 例如,请参阅以下评论......
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
}
}
答案 0 :(得分:10)
您只想在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值的影响。
这些差异可能是无关紧要的,这取决于你的目的......我甚至不确定它是否可能在管理内存中获得确切的大小(或者至少没有很大的困难)。
答案 1 :(得分:1)
请注意,字段大小的总和不会总计任何给定类实例使用的内存量。 CLR用于各种目的的对齐填充和对象头信息,以及用于监视器支持的可能关联同步原语(C#中的lock
关键字)将不属于总数。