可以使用
获取struct的大小
Marshal.SizeOf(typeof(mystruct));
是否可以获得结构的一部分的大小(例如,我传递给结构的最后一个字段并返回先前字段的大小的总和)? 据我所知,可以使用反射吗?
答案 0 :(得分:3)
[StructLayout(LayoutKind.Explicit)]
public struct SomeStruct
{
[FieldOffset(0)]
public byte b1;
[FieldOffset(3)]
public byte b2;
[FieldOffset(7)]
public int i1;
[FieldOffset(12)]
public int i2;
}
class Program
{
static FieldOffsetAttribute GetFieldOffset(string fieldName)
{
return (FieldOffsetAttribute)typeof(SomeStruct)
.GetField(fieldName)
.GetCustomAttributes(typeof(FieldOffsetAttribute), false)[0];
}
static void Main(string[] args)
{
var someStruct = new SomeStruct { b1 = 1, b2 = 2, i1 = 3, i2 = 4 };
Console.WriteLine("field b1 offset: {0}", GetFieldOffset("b1").Value);
Console.WriteLine("field b2 offset: {0}", GetFieldOffset("b2").Value);
Console.WriteLine("field i1 offset: {0}", GetFieldOffset("i1").Value);
Console.WriteLine("field i2 offset: {0}", GetFieldOffset("i2").Value);
Console.ReadLine();
}
}
打印: 字段b1偏移量:0 字段b2偏移量:3 field i1 offset:7 field i2 offset:12
答案 1 :(得分:2)
.NET中无法发现结构的内存布局。 JIT编译器利用了这一点,它重新排序结构的字段以获得更高效的布局。这会破坏任何以绕过正常编组机制的方式使用结构的尝试。是的,Marshal.SiseOf()为结构生成一个大小。但是这个大小只有在使用Marshal.StructureToPtr()之后才有效。
直接回答你的问题:不,你无法发现大小,甚至没有反射。按设计。
答案 2 :(得分:1)
嗯,我不确定,但我认为由于可能的优化和对齐问题,这是不可能的。