문제

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;}
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top