C#相当于C联合[重复]

Posted

技术标签:

【中文标题】C#相当于C联合[重复]【英文标题】:C# equivalent to C union [duplicate] 【发布时间】:2009-05-12 12:15:11 【问题描述】:

重复 C++ union in C#

是否有与 C union typedef 等效的 C#? 在 C# 中,以下内容的等价物是什么?

typedef union byte_array

    structbyte byte1; byte byte2; byte byte3; byte byte4;;
    structint int1; int int2;;
;byte_array

【问题讨论】:

【参考方案1】:

C# 本身并不支持 C/C++ 的联合概念。但是,您可以使用 StructLayout(LayoutKind.Explicit) 和 FieldOffset 属性来创建等效功能。 请注意,这仅适用于 int 和 float 等原始类型。

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct byte_array

    [FieldOffset(0)]
    public byte byte1;

    [FieldOffset(1)]
    public byte byte2;

    [FieldOffset(2)]
    public byte byte3;

    [FieldOffset(3)]
    public byte byte4;

    [FieldOffset(0)]
    public short int1;

    [FieldOffset(2)]
    public short int2;

【讨论】:

实际上,除了原生原始类型之外,这也适用于定义为结构的用户创建值。见这里:***.com/documentation/c%23/5626/… Milton 之前的评论中提到的文档(他也是正确的)可以(此时)在这里找到:sodocumentation.net/csharp/topic/5626/…【参考方案2】:

使用StructLayout 属性,它看起来有点像这样:

    [StructLayout(LayoutKind.Explicit, Pack=1)]
    public struct ByteArrayUnion
    
        #region Byte Fields union

        [FieldOffset(0)]
        public byte Byte1;

        [FieldOffset(1)]
        public byte Byte2;

        [FieldOffset(2)]
        public byte Byte3;

        [FieldOffset(3)]
        public byte Byte4;

        #endregion

        #region Int Field union

        [FieldOffset(0)]
        public int Int1;

        [FieldOffset(4)]
        public int Int2;

        #endregion
    

【讨论】:

【参考方案3】:

您的问题没有说明您的目的是什么。如果您希望将数据编组为 pinvoke,那么上述 2 个答案是正确的。

如果没有,您只需这样做:

class Foo

  object bar;
  public int Bar get return (int)bar;  
  ...

【讨论】:

你能详细说明一下这个答案吗?

以上是关于C#相当于C联合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#中的可区分联合

联合索引

联合索引

C#调用C++DLL的小总结5---和C++的DLL的联合调试

C# 联合结构编组

C语言-结构联合枚举