C# · 12月 26, 2021

如何在C#中模拟C联合?

我有一个小问题关于结构与LayoutKind.Explicit属性设置.我声明了可以看到的结构,一个fieldTotal为64位,fieldFirst为前32个字节,fieldSecond为最后32个字节.在将fieldfirst和fieldSecond设置为Int32.MaxValue之后,我希望fieldTotal为Int64.MaxValue,实际上不会发生.为什么是这样?我知道C#并不真的支持C工会,也许只有在interoping时才会读取这些值,但是当我们尝试设置值时,它根本不会很好的处理它? [StructLayout(LayoutKind.Explicit)]struct STRUCT { [FieldOffset(0)] public Int64 fieldTotal; [FieldOffset(0)] public Int32 fieldFirst; [FieldOffset(32)] public Int32 fieldSecond;} STRUCT str = new STRUCT(); str.fieldFirst = Int32.MaxValue; str.fieldSecond = Int32.MaxValue; Console.WriteLine(str.fieldTotal); // <—– I’d expect both these values Console.WriteLine(Int64.MaxValue); // <—– to be the same. Console.ReadKey();解决方法 原因是FieldOffsetAttribute需要多个字节作为参数 – 而不是位数.这样可以预期: [StructLayout(LayoutKind.Explicit)]struct STRUCT{ [FieldOffset(0)] public Int64 fieldTotal; [FieldOffset(0)] public Int32 fieldFirst; [FieldOffset(4)] public Int32 fieldSecond;}