質問

私は翻訳図書館のC++で記述されるスレッドセーフで、C#、およびキーワード'union"が存在します。は、struct.

何が正しい翻訳ではC#?とどのようにするのですか?するとどうなるのかわかりませんが、

struct Foo {
    float bar;

    union {
        int killroy;
        float fubar;
    } as;
}
役に立ちましたか?

解決

利用できる明示的なロールはパワフルで明瞭る:

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

潜在的に秘.仕組みとしては二つの変数は同じ位置におstruct.もちろんのみを使用します。

詳約労働組合に structのチュートリアル

他のヒント

したりすることはできませんを決めることを知らずに何かをするようにしてください。を使用します。ばれているに過ぎないと使用し、省スペースをそのまま無視することだけを使用struct.

しかしその実施が通常行われておらず、なぜ労働組合に使用します。が共通の理由で利用します。を与えたというものである2以上の方にアクセスと同じデータです。例えば、unionのintの配列は4バイトでの多くの方に別のバイトの32ビット整数です。

その時のデータ構造体から来た外部ソースなどのネットワークデータパケット.普通の要素構造体を内包し合は、IDが分かる趣連合(eu)が有効となる。

でもこれらのケースバイケースでお求を無視する場合に変換する構造体には分野におい一致させる機能です。

C/C++の和集合が使用されていますをオーバーレイの異なるメンバーに同一のメモリ場所、その場所には、unionのintとをfloatとも同じ4バイトのメモリもちろんのこと、文書一corruptsの他(intとfloat異なるビットレイアウト).

ます。純Microsoftって、より安全な選択肢となるこの特徴です。

編集:を除き、interop

でご利用の場合は、 union 地図バイトの種類、その他のクライアントまで、フルのC#が使用でき BitConverter です。

float fubar = 125f; 
int killroy = BitConverter.ToInt32(BitConverter.GetBytes(fubar), 0);

または;

int killroy = 125;
float fubar = BitConverter.ToSingle(BitConverter.GetBytes(killroy), 0);

個人的には思を無視する組合と、実施するKillroyとFubarとして別分野

public struct Foo
{
    float bar;
    int Kilroy;
    float Fubar;
}

を組合省32ビットのメモリ割り当てるint....なろうとしているアプリです。

public class Foo
{
    public float bar;
    public int killroy;

    public float fubar
    {
        get{ return (float)killroy;}
        set{ killroy = (int)value;}
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top