2009-06-05 4 views
7

이 궁금입니다.(객체) 0 == (객체) 0

Reflection에서 개체를 반환하는 ValueType의 기본값을 가져 왔기 때문에 개체의 현재 값과 비교할 때 두 개체가 같지 않지만 동일한 값을 갖기 때문에 나에게 찾아 왔습니다.

Equals 또는 ToString을 사용하면 ValueType 개체에서 작동하지만 ReferenceType에서는 null이 될 수 있으므로 Equals 또는 ToString을 허용하지 않습니다.

다른 사람이 어떤 유형이 될 수있는 다른 객체를 비교할 수있는 방법을 알려주면 객체 == 객체가 잘못된 방식 인 것 같습니다. 이 경우에는 내 객체를 원래 유형으로 다시 작성해야합니다. ReferenceType은 항상 다릅니 까?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx (권투 참조) – meandmycode

답변

25

예, 그것은 복싱과 양쪽 비교이며 참조를 비교합니다. 상자를 만들 때마다 새 객체가 만들어 지므로 참조가 다릅니다.

Equals 메서드와 비교하는 것은 무효를 고려한 이동 방법입니다.

if (object.Equals(x, y)) 
{ 
    ... 
} 
4

당신은 권투이므로 '캐스트'는 실제로 각각 하나씩 새로운 개체를 만듭니다. 당신이 당신의 객체와 비교한다면 당신은 자신의 .Equals 구현을 써야 할 수도 있습니다.

0

기본적으로, 위의 두 객체 참조를 만드는 다음 메모리 어드레스를 비교하여, 메모리의 다른 위치에 저장하는 가장 쉬운 방법은 정적 object.Equals(object, object) 방법을 사용하는 것이다. 그 이유 때문에 매회 false가 반환됩니다.

내가 아는 두 객체를 비교하는 유일한 방법은 하나 또는 둘 모두의 객체가 null인지 확인하는 것입니다 (하나가 null이고 다른 객체가 아닌 경우 해당 객체는 같지 않습니다. null == null) 어느 것도 null가 아닌 경우는, 오브젝트에 대해서 .equals를 안전하게 호출 할 수가 있습니다.

0

캐스팅은 본질적으로 새로운 개체를 생성하는 복싱을 강요합니다. 그런 다음 참조가 비교됩니다.

Console.Write(((object)0).Equals((object)0)); // outputs "True" 
0

이 명확히 수 있습니다 것들을 조금 : 당신은 (참조가 가리키는 객체의 구현 비교를 사용) 대신 컨텐츠로 개체를 비교하려면 Equals 메서드를 사용해야합니다.

object zero = (object) 0; return (object.Equals (zero, zero)); // true를 반환