문제
C ++로 작성된 라이브러리를 C#로 번역하고 키워드 'Union'이 한 번 존재합니다. 구조물에서.
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;
}
테스트되지 않았습니다. 아이디어는 두 변수가 구조물에서 동일한 위치를 가지고 있다는 것입니다. 물론 그들 중 하나만 사용할 수 있습니다.
노조에 대한 더 많은 정보 구조 자습서
다른 팁
당신은 그것이 어떻게 사용되는지에 대해 무언가를 모르고 이것을 다루는 방법을 실제로 결정할 수 없습니다. 단지 공간을 절약하는 데 사용되는 경우 공간을 무시하고 구조물 만 사용할 수 있습니다.
그러나 이것이 일반적으로 노조가 사용되는 이유는 아닙니다. 그것들을 사용해야 할 두 가지 일반적인 이유가 있습니다. 하나는 동일한 데이터에 액세스하는 2 가지 이상의 방법을 제공하는 것입니다. 예를 들어, INT의 Union과 4 바이트 배열은 32 비트 정수의 바이트를 분리하는 많은 방법 중 하나입니다.
다른 하나는 구조물의 데이터가 네트워크 데이터 패킷과 같은 외부 소스에서 나온시기입니다. 일반적으로 노조를 둘러싸는 구조물의 한 요소는 유니온의 풍미가 어떤 맛인지 알려주는 신분증입니다.
이 경우 어느 경우에도 노동 조합을 맹목적으로 무시하고 두 개 (또는 그 이상) 필드가 일치하지 않는 구조물로 변환 할 수 있습니다.
C/C ++ Union에서는 동일한 메모리 위치에서 다른 멤버를 오버레이하는 데 사용되므로 INT와 플로트의 결합이있는 경우 둘 다 동일한 4 바이트의 메모리를 사용하여 저장합니다. int와 float마다 비트 레이아웃이 다릅니다).
.NET에서 Microsoft는 더 안전한 선택을 통해이 기능을 포함하지 않았습니다.
편집 : 인터 로프를 제외하고
사용하는 경우 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;
}
Union을 사용하면 int가 할당 한 32 비트의 메모리를 절약합니다 .... 요즘 앱을 만들거나 깨지 않을 것입니다.
public class Foo
{
public float bar;
public int killroy;
public float fubar
{
get{ return (float)killroy;}
set{ killroy = (int)value;}
}
}