다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
.NET Framework는 객체의 선후 관계를 판단할 수 있는 IComparable<T>와 IComparer<T>를 제공한다.
더불어 C#은 타입 내의 관계 연산자 (<, >, <=, >=)를 재 정의하여 선후 관계를 판단할 수 있다.
IComparable, IComparable<T>
- 하나의 메서드만 정의되어있다.
- 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 값을 반환한다.
public interface IComparable
{
int CompareTo(object obj);
}
IComparer, IComparer<T>
- 하나의 메서드만 정의되어있다.
- x가 y보다 작다면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 값을 반환한다.
public interface IComparer
{
int Compare(object x, object y);
}
관계 연산자 재정의
- 관계 연산자 내부에서 CompareTo를 호출하도록 재정의 하면 선후 비교가 보다 쉬워진다.
public class A : IComparable<A>
{
private readonly string name;
public int CompareTo(A other)
{
return name.CompareTo(other.name);
}
public static bool operator <(A left, A right)
=> left.CompareTo(right) < 0;
public static bool operator <=(A left, A right)
=> left.CompareTo(right) <= 0;
public static bool operator >(A left, A right)
=> left.CompareTo(right) > 0;
public static bool operator >=(A left, A right)
=> left.CompareTo(right) >= 0;
}
결론
IComparable과 IComparer를 구현하여 객체의 선후관계를 정의하자.
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[22] 공변성과 반공변성을 지원하라 (0) | 2021.04.27 |
---|---|
[21] 타입 매개변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 (0) | 2021.04.27 |
[19] 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 (0) | 2021.04.26 |
[18] 반드시 필요한 제약조건만 설정하라 (0) | 2021.04.26 |
[17] 표준 Dispose 패턴을 구현하라 (0) | 2021.04.26 |