2014-02-10 2 views
0

"비 객체 필드"오류에 다음 코드와 잘못 정렬되거나 겹쳐졌습니다.문자열이 잘못 정렬 된 C#의 Union

public struct TypeA 
{ 
    public string A1; 
    public string A2; 
} 
public struct TypeB 
{ 
    public string B1, 
    public string B2; 
} 

나는 내가 문제가 구조체문자열에서 오는 생각

[StructLayout(LayoutKind.Explicit)] 
public struct TypeAorB 
{ 
    [FieldOffset(0)] 
    public TypeA aa; 

    [FieldOffset(0)] 
    public TypeB bb; 
} 

을 LayoutKind.Explicit System.Runtime.InteropServices를 사용하여 조합을 구현했습니다. 이 문제를 어떻게 극복 할 수 있습니까?

+0

관리 된 (스칼라가 아닌) 유형의 앨리어싱이 허용되지 않을 수도 있습니다. –

+0

이 작업을 통해 달성하려는 목표는 무엇입니까? –

+0

고마워, 내가 뭘하려는 건 슈퍼 * 구조체 * 여러 * 구조체 * (들) 유지 관리를 구현하는 것입니다. C 코드에서 * union *을 얻으려고합니다. 이제는 * 참조 유형 *을 겹칠 수 없다는 것을 이해합니다. – sMah

답변

2

. 문자열은 참조 유형이며 유니언의 다른 어떤 것과도 겹칠 수 없습니다. 그것은 가비지 수집기에 큰 영향을 미치지 만, 어떤 참조가 필드에 저장되는지 안정적으로 파악할 수 없으므로 문자열 객체를 유지해야하는지 여부를 신뢰할 수 없습니다.

구조체에 대한 bizarro는 문자열과 문자열을 겹치게하는 것입니다. 기술적으로 작동 할 것이고, 가비지 수집기가 항상 유효한 객체 참조를 보게되므로 혼동하지 않아야합니다. 그러나 실제로 특수한 경우를 처리하지는 않습니다. Microsoft는 충분한 코드를 작성하지 않았거나 CPU주기를 구워서 형식 ID를 확인했습니다.

은 선언문에서 중복 될 필요가 없기 때문에 그럴만 한 이유가 있습니다. Microsoft가 중첩을 쉽게 피할 수있을 때이를 인식하는 특수 코드를 작성할 필요가 없습니다.

귀하의 예에서 거북이는 모두 입니다. 모든 공용 영역은 동일합니다. 따라서 노조를 사용하는 데는 전혀 문제가 없습니다.

그렇게하지 마세요.

+0

답장과 설명에 감사드립니다. – sMah

0

왜 필드 오프셋이 같은가요? 0과 0+ [TypeA의 크기]이어야합니다.

유형 A는 2x 문자열이므로 8 바이트이며, 각 유형은 4 바이트 포인터를 사용합니다. 따라서

...

[StructLayout(LayoutKind.Explicit)] 
    public struct TypeAorB 
    { 
     [FieldOffset(0)] 
     public TypeA aa; 

     [FieldOffset(8)] 
     public TypeB bb; 
    } 

다시 b를 입력의 세 번째 필드를 추가한다면, 당신이해야 할 것 : 당신이 할하려고하는 것은 정당하지 않은

[StructLayout(LayoutKind.Explicit)] 
    public struct TypeAorB 
    { 
     [FieldOffset(0)] 
     public TypeA aa; 

     [FieldOffset(8)] 
     public TypeB bb; 

     [FieldOffset(16)] 
     public TypeB bb; 
    } 
+0

감사합니다. Jon, 유용한 정보입니다. – sMah

+0

그는 노동 조합을 만들려고하기 때문에. –

관련 문제