Program Tip

이 두 비교 결과가 다른 이유는 무엇입니까?

programtip 2020. 11. 6. 19:06
반응형

이 두 비교 결과가 다른 이유는 무엇입니까?


이 코드가 true를 반환하는 이유 :

new Byte() == new Byte()   // returns true

하지만이 코드는 false를 반환합니다.

new Byte[0] == new Byte[0] // returns false

new Byte()값으로 비교되는 값 유형을 생성 하기 때문입니다 (기본적 byte으로 value로 반환 됨 0). 그리고 new Byte[0]참조 유형이고 참조로 비교되는 배열을 만듭니다 (이 배열의 두 인스턴스는 다른 참조를 갖습니다).

자세한 내용은 값 유형 및 참조 유형 문서를 참조하세요.


바이트는 .NET의 값 유형 입니다. 즉 ==, 두 바이트의 값이 동일한 경우에만 연산자가 true를 반환합니다. 이를 가치 평등 이라고도 합니다 .

그러나 배열은 .NET에서 참조 유형 입니다. 즉, ==메모리에서 동일한 배열 인스턴스를 참조하는 경우에만 연산자가 true를 반환합니다. 이를 참조 같음 또는 동일성 이라고도 합니다.

점을 유의 ==운영자 모두 기준 값 및 유형의 오버로드 될 수있다. System.String예를 들어는 참조 유형이지만 ==문자열 연산자는 배열의 각 문자를 순서대로 비교합니다. 참조 가이드 라인 오버로드가 같음을 위해 ()와 연산자 == (C #을 가이드 프로그래밍) .

배열에 정확히 동일한 값 (순서대로)이 포함되어 있는지 테스트 하려면 Enumerable.SequenceEqual대신을 사용하는 것이 좋습니다 ==.


비교 참조는 실제로 포인터 주소를 비교하는 것인데, 이는 false를 반환하는 이유이고 값 주소에서 값을 비교하는 것이 중요하지 않습니다.

컴파일러는 레지스터에 값 유형을 저장하려고하지만 제한된 레지스터 수로 인해 참조 유형이 스택에 있지만 힙에 메모리 주소의 주소를 보유하는 값이있는 동안 [참조] 값이있는 스택에 추가 저장이 발생합니다 .

여기서 비교는 첫 번째 경우에 동일한 스택에있는 값을 비교하고 두 번째 경우에는 다른 힙의 주소입니다.

참고


==두 피연산자가 모두 유형 byte이고 각 바이트의 값을 비교하기 위해 구현 되는 연산자 의 오버로드가 있습니다 . 이 경우 두 개의 0 바이트가 있고 동일합니다.

==연산자 과부하 배열되지 않으므로 두 가지는 과부하 object피연산자 (어레이 형이기 때문에 사용하는 object후자의 경우), 그것의 구현은 두 개의 객체에 대한 참조를 비교한다. 두 배열에 대한 참조가 다릅니다.

이것은 byte값 유형이고 배열이 참조 유형 이라는 사실과 (직접적으로) 아무 관련이 없다는 점에 주목할 가치가 있습니다. ==위한 연산자 byte값 의미를 갖는 경우에만 그 실행과 작동 자의 특정 과부하가 있기 때문이다. 그 과부하가 존재하지 않은 경우,이 것이 없을 두 바이트가 유효 피연산자 될하는 과부하,과 같은 코드로 전혀 컴파일되지 않을 것이다 . 사용자 지정을 만들고 struct두 인스턴스를 ==연산자 와 비교하여 쉽게 확인할 수 있습니다 . ==해당 유형 대한 자체 구현을 제공하지 않는 한 코드는 컴파일되지 않습니다 .

참고 URL : https://stackoverflow.com/questions/21122269/why-do-these-two-comparisons-have-different-results

반응형