Ich übersetze eine in C ++ geschriebene Bibliothek in C #, und das Schlüsselwort 'union' existiert einmal. In einer Struktur.
Was ist die richtige Art, es in C # zu übersetzen? Und was macht es? Es sieht ungefähr so aus;
struct Foo {
float bar;
union {
int killroy;
float fubar;
} as;
}
Antworten:
Sie können dafür explizite Feldlayouts verwenden:
[StructLayout(LayoutKind.Explicit)] public struct SampleUnion { [FieldOffset(0)] public float bar; [FieldOffset(4)] public int killroy; [FieldOffset(4)] public float fubar; }
Ungetestet. Die Idee ist, dass zwei Variablen dieselbe Position in Ihrer Struktur haben. Sie können natürlich nur einen davon verwenden.
Weitere Informationen zu Gewerkschaften finden Sie im Struktur-Tutorial
quelle
Sie können sich nicht wirklich entscheiden, wie Sie damit umgehen sollen, ohne etwas darüber zu wissen, wie es verwendet wird. Wenn es nur zum Platzsparen verwendet wird, können Sie es ignorieren und einfach eine Struktur verwenden.
Dies ist jedoch normalerweise nicht der Grund, warum Gewerkschaften eingesetzt werden. Es gibt zwei häufige Gründe, sie zu verwenden. Eine besteht darin, zwei oder mehr Möglichkeiten bereitzustellen, um auf dieselben Daten zuzugreifen. Zum Beispiel ist eine Vereinigung eines int und eines Arrays von 4 Bytes eine (von vielen) Möglichkeiten, die Bytes einer 32-Bit-Ganzzahl zu trennen.
Das andere ist, wenn die Daten in der Struktur von einer externen Quelle stammen, beispielsweise einem Netzwerkdatenpaket. Normalerweise ist ein Element der Struktur, die die Union einschließt, eine ID, die angibt, welche Variante der Union wirksam ist.
In keinem dieser Fälle können Sie die Vereinigung blind ignorieren und in eine Struktur konvertieren, in der die zwei (oder mehr) Felder nicht übereinstimmen.
quelle
Wenn Sie die verwenden
union
, um die Bytes eines der Typen dem anderen zuzuordnen, können SieBitConverter
stattdessen in C # verwenden .float fubar = 125f; int killroy = BitConverter.ToInt32(BitConverter.GetBytes(fubar), 0);
oder;
int killroy = 125; float fubar = BitConverter.ToSingle(BitConverter.GetBytes(killroy), 0);
quelle
In C / C ++ wird Union verwendet, um verschiedene Mitglieder am selben Speicherort zu überlagern. Wenn Sie also eine Union aus einem Int und einem Float haben, verwenden beide dieselben 4 Byte Speicher zum Speichern, wobei das Schreiben in eines offensichtlich das andere beschädigt (seitdem int und float haben unterschiedliche Bitlayouts).
In .Net entschied sich Microsoft für die sicherere Wahl und schloss diese Funktion nicht ein.
EDIT: außer interop
quelle
Persönlich würde ich die UNION alle zusammen ignorieren und Killroy und Fubar als separate Felder implementieren
public struct Foo { float bar; int Kilroy; float Fubar; }
Die Verwendung einer UNION spart 32 Bit Speicher, die vom int zugewiesen werden. Heutzutage wird keine App mehr erstellt oder beschädigt.
quelle
public class Foo { public float bar; public int killroy; public float fubar { get{ return (float)killroy;} set{ killroy = (int)value;} } }
quelle