2011-03-10 3 views
3

하나의 구조체 값을 다른 구조체에 할당 할 수 있으며 메모리가 자동으로 복사됩니다. 하지만 두 개의 구조체에 동일한 데이터가 포함되어 있는지 테스트하고 싶다면 (내가 방금 과제를 수행 한 것처럼) 명시 적으로 코드를 작성해야합니다. 왜 그런가요? 프레임 워크는 구조체에 대해 == 연산자의 기본 구현을 가져야하는 것처럼 보입니다.C#은 구조체의 mem을 복사 할 수는 있지만 평등성을 테스트 할 수는 없습니까?

+0

주관적입니다. 디자이너들은 어떤 이유로 그것을 선택했습니다. 프로그래머에 대해 토론하는 것이 더 낫다. –

+2

내가 아는 한, 그것이 작동하는 견고한 기술적 이유가있다. 그렇다면 놀랄 일도 아닙니다. 나는 그것을 찾으려고 노력하고있다. – Fantius

답변

5

프레임 워크의 기본값은 Equals입니다. == 연산자는 원하는 경우 Equals을 사용하여 직접 구현해야하는 C# 기능입니다. 당신이 실행 네이티브 코드 권한이있는 경우

+0

'같음'이 기본값으로 'object.ReferenceEquals'를 호출하지 않습니까? 그것은'struct'에 대해서는별로 유용하지 않습니다. –

+0

아니요. System.ValueType은 CLR 내부에서 구현되는 오버로드를 정의합니다. 그것은 깊은 비교를합니다. –

+0

Ok .... 문서를 살펴 봅니다. * reflection *을 사용하고 성능이 떨어지는 것을 언급합니까? –

-2

, 단지 memcmp 전화 :

static class memcmpsig<T> where T : struct 
{ 
    [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)] 
    static extern int memcmp(ref T left, ref T right, UIntPtr count); 
} 

static class CompareExtension 
{ 
    int CompareTo<T>(this T left, T right) { return memcmpsig<T>::memcmp(left, right, Marshal::SizeOf(typeof(T)); 
} 
+0

그건 과잉이야. 그래도 동료들에게 감명을 줄 것입니다 :-) –

+1

기본 'ValueType.Equals' 메소드는 어떤 상황에서도'memcmp'를 사용하도록 최적화되어 있습니다. http://blogs.msdn.com/b/xiangfan/archive/2008/09/01/magic-behind-valuetype-equals.aspx – LukeH

+1

그러나 최적화는 해당 블로그 항목의 예와 같이 버그로 간주 될 수 있습니다. 나에게 ValueType.Equals는 매우 느렸다. 내 유형이 최적화 기준을 충족시키지 못했다고 가정합니다. – Fantius

6

ValueType.Equals의 기본 구현은 정확하게 당신이 원하는 않습니다. 따라서 수행 할 작업 :

s1 = ...; 
s2 = ...; 
s1.Equals(s2); 

"같음"을 호출하면 찾고있는 자동 비교가 자동으로 수행됩니다.

일반적으로 C#은 오버로드 된 연산자를 사용하지 않는 경향이 있습니다. 이는 아마도 연산자를 구현하지 않는 이유 일 수 있습니다.

또한 철학적으로 C#은 암시적인 메서드 생성과 같은 것들을 포함하여 암시 적 동작에서 벗어나려는 경향이 있습니다.

+3

또한 stuct 내의 모든 참조 유형에는 "심층 비교"에서 호출되는 Equals 메서드가 추가됩니다. –

관련 문제