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联合[重复]的主要内容,如果未能解决你的问题,请参考以下文章