본문 바로가기
프로그래밍/C#.net

[effective C#] item #9: ReferenceEquals(),static() Equals(),instance Equals(),operator==의 상호 연관성을 이해하라.

by 건우아빠유리남편 2009. 8. 24.
반응형

■ITEM#9 ReferenceEquals(),static() Equals(),instance Equals(),operator==의 상호 연관성을 이해하라.
새로운 타입을 만드는 경우 동일성의 의미를 정확히 규정하는 것은 매우 중요하다.

C#에서 동일함을 비교하는 메서드
public static bool ReferenceEquals(object left, object right) ←재작성X
public static bool Equals(object left, object right) ←재작성X
public virtual bool Equals(object right) ←재작성O
public static bool operator==(Myclass left, Myclass right) ←재작성O

하지만,2개의 static메서드는절대 재작성하면 안 된다.
4개의 메서드는 상호연관성이 있기때문에 만일 이중 하나를 재정의하게 되면 다른 메서드의 동작에도 영향을 주게 된다.

C#에서 '같다'라는 의미
- reference type변수: 동일객체를 참조하고 있는 경우
- value type변수: 서로 type이 같고, 동일한 값을가지고 있을 때

수학에서 '같다'라는 의미
- 재귀성: a == a 라는 비교연산식은 a의 타입과 상관없이 항상 참이여야 한다.
- 대칭성: a == b 라는 비교연산이 참이면, b == a도 참이여야 한다.
- 전이성: a == b 가 참이고, b == c 가 참이면 a == c 도 참이여야 한다.

...

우리가 value타입을 정의하는 경우라면 수행성능의 향상을 위해서 인스턴스형 Equals() 메서드와 operator==()를 재정의하자.
Reference 타입을 정의하는경우라면 객체에 대한 참조자를 비교하는 System.Object의 기본동장을 변경해야 할 경우에 한해서 인스턴스형 Equals()만을 재정의하자..


반응형

댓글