如何在C#中模拟C联合?
发布时间:2020-12-15 04:10:35 所属栏目:百科 来源:网络整理
导读:我有一个小问题关于结构与LayoutKind.Explicit属性设置.我声明了可以看到的结构,一个fieldTotal为64位,fieldFirst为前32个字节,fieldSecond为最后32个字节.在将fieldfirst和fieldSecond设置为Int32.MaxValue之后,我希望fieldTotal为Int64.MaxValue,实际上不
我有一个小问题关于结构与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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |