하나의 구조체 값을 다른 구조체에 할당 할 수 있으며 메모리가 자동으로 복사됩니다. 하지만 두 개의 구조체에 동일한 데이터가 포함되어 있는지 테스트하고 싶다면 (내가 방금 과제를 수행 한 것처럼) 명시 적으로 코드를 작성해야합니다. 왜 그런가요? 프레임 워크는 구조체에 대해 == 연산자의 기본 구현을 가져야하는 것처럼 보입니다.C#은 구조체의 mem을 복사 할 수는 있지만 평등성을 테스트 할 수는 없습니까?
답변
프레임 워크의 기본값은 Equals
입니다. ==
연산자는 원하는 경우 Equals
을 사용하여 직접 구현해야하는 C# 기능입니다. 당신이 실행 네이티브 코드 권한이있는 경우
'같음'이 기본값으로 'object.ReferenceEquals'를 호출하지 않습니까? 그것은'struct'에 대해서는별로 유용하지 않습니다. –
아니요. System.ValueType은 CLR 내부에서 구현되는 오버로드를 정의합니다. 그것은 깊은 비교를합니다. –
Ok .... 문서를 살펴 봅니다. * reflection *을 사용하고 성능이 떨어지는 것을 언급합니까? –
, 단지 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));
}
그건 과잉이야. 그래도 동료들에게 감명을 줄 것입니다 :-) –
기본 'ValueType.Equals' 메소드는 어떤 상황에서도'memcmp'를 사용하도록 최적화되어 있습니다. http://blogs.msdn.com/b/xiangfan/archive/2008/09/01/magic-behind-valuetype-equals.aspx – LukeH
그러나 최적화는 해당 블로그 항목의 예와 같이 버그로 간주 될 수 있습니다. 나에게 ValueType.Equals는 매우 느렸다. 내 유형이 최적화 기준을 충족시키지 못했다고 가정합니다. – Fantius
ValueType.Equals
의 기본 구현은 정확하게 당신이 원하는 않습니다. 따라서 수행 할 작업 :
s1 = ...;
s2 = ...;
s1.Equals(s2);
"같음"을 호출하면 찾고있는 자동 비교가 자동으로 수행됩니다.
일반적으로 C#은 오버로드 된 연산자를 사용하지 않는 경향이 있습니다. 이는 아마도 연산자를 구현하지 않는 이유 일 수 있습니다.
또한 철학적으로 C#은 암시적인 메서드 생성과 같은 것들을 포함하여 암시 적 동작에서 벗어나려는 경향이 있습니다.
또한 stuct 내의 모든 참조 유형에는 "심층 비교"에서 호출되는 Equals 메서드가 추가됩니다. –
- 1. Haskell Text.Json 패키지는 Rationals를 읽을 수는 있지만 쓸 수는 없습니까?
- 2. 읽을 수는 있지만 업데이트 할 수 없음
- 3. .NETCF 3.5 응용 프로그램을 장치에 배포 할 수는 있지만 디버그 할 수는 없습니다
- 4. 는 할 수는
- 5. 내 레일 앱에서 쿠키를 읽을 수는 있지만 설정할 수는 없습니다
- 6. OpenGL 프레임 버퍼 : 그것을 지울 수는 있지만 그릴 수는 없습니다.
- 7. MS Access 사용자가 데이터를 입력 할 수는 있지만 수정할 수는 없습니다.
- 8. 시스템에서 파일을 삭제할 수는 있지만 프로그램은 삭제할 수 없습니까?
- 9. 파일을 추적 할 수는 있지만 업데이트 된 것으로 표시되지 않습니까?
- 10. 마우스로 스크롤 할 수는 있지만 브라우저 스크롤바는 표시하지 않습니까?
- 11. 효과를 찾고 있지만 이름을 모르므로 실제로 검색 할 수는 없습니다.
- 12. JScrollPane을 지울 수는 있지만 테이블을 '부착 할 수 없습니다.
- 13. XMLSocket은 데이터를받을 수는 있지만 보낼 수 없음
- 14. IPhone 응용 프로그램을 테스트 할 수있는 장치의 수는 얼마입니까
- 15. 서버의 디렉토리/파일을 외부 세계로부터 보호 할 수는 있지만 PHP에서 액세스 할 수있게 할 수 있습니까?
- 16. 안드로이드 수는
- 17. 카운트 수는
- 18. 는 할 수는 조건 연산자는 암시 적으로 ...
- 19. 최대 수는
- 20. 최대 수는
- 21. 계수의 수는
- 22. 추가 부동 소수점 수는
- 23. 사진을 업로드 할 수는 있지만 Facebook의 게시판에는 게시 할 수 있습니까?
- 24. Python 스크립트에서 C 함수의 값을 retieve 할 수는 있지만 콘솔에서는 수행 할 수 없습니다.
- 25. NSCell은 setEnabled입니다. 편집 할 수는 있지만 아직 액세스 할 수 있습니다.
- 26. 은 Visual Studio IDE를 사용하여 빌드 할 수 있지만 devenv.com을 사용하여 빌드 할 수는 없습니다.
- 27. 문자열을 char로 변환 할 수 있지만 문자열을 char로 변환 할 수는 없습니다.
- 28. 장고 동적 수는
- 29. 사용자가 mp3 파일을 재생할 수는 있지만 직접 웹에 노출시키지 않아야합니다.
- 30. 프로세서의 수는 무엇을 의미합니까
주관적입니다. 디자이너들은 어떤 이유로 그것을 선택했습니다. 프로그래머에 대해 토론하는 것이 더 낫다. –
내가 아는 한, 그것이 작동하는 견고한 기술적 이유가있다. 그렇다면 놀랄 일도 아닙니다. 나는 그것을 찾으려고 노력하고있다. – Fantius