当前位置:  开发笔记 > 编程语言 > 正文

C#中的C++联合

如何解决《C#中的C++联合》经验,为你挑选了2个好方法。

我正在将用C++编写的库翻译成C#,关键字"union"只存在一次.在结构中.

将它翻译成C#的正确方法是什么?它做了什么?它看起来像这样;

struct Foo {
    float bar;

    union {
        int killroy;
        float fubar;
    } as;
}

Armin Ronach.. 76

您可以使用显式字段布局:

[StructLayout(LayoutKind.Explicit)] 
public struct SampleUnion
{
    [FieldOffset(0)] public float bar;
    [FieldOffset(4)] public int killroy;
    [FieldOffset(4)] public float fubar;
}

未经测试.这个想法是两个变量在你的结构中具有相同的位置.你当然只能使用其中一个.

关于结构教程中的联合的更多信息



1> Armin Ronach..:

您可以使用显式字段布局:

[StructLayout(LayoutKind.Explicit)] 
public struct SampleUnion
{
    [FieldOffset(0)] public float bar;
    [FieldOffset(4)] public int killroy;
    [FieldOffset(4)] public float fubar;
}

未经测试.这个想法是两个变量在你的结构中具有相同的位置.你当然只能使用其中一个.

关于结构教程中的联合的更多信息


它是否适用于值类型(如枚举)或原始类型?
请注意,仅当涉及的类型是基本类型(如int和float)时,这才有效.一旦涉及到对象,它就不会让你.

2> Steve Fallow..:

如果不知道如何使用它,你无法真正决定如何处理它.如果它仅用于节省空间,那么您可以忽略它并只使用结构.

然而,这通常不是使用工会的原因.使用它们有两个常见的原因.一种是提供两种或更多种访问相同数据的方法.例如,int和4个字节数组的并集是分离出32位整数字节的一种(多种)方法.

另一种是结构中的数据来自外部源,例如网络数据包.通常,包含联合的结构的一个元素是一个ID,它告诉您联合的哪种风格有效.

在这两种情况下,你都不能盲目地忽略联合并将其转换为两个(或更多)字段不重合的结构.


我认为在Steve的回答中重要的是,你真的需要了解你正在移植的特定联盟的用法.C#中可能还有其他构造可以更优雅的方式满足需求.
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有