加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读