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

前端之家收集整理的这篇文章主要介绍了如何在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;
}
原文链接:https://www.f2er.com/csharp/92579.html

猜你在找的C#相关文章