이펙티브 c# (5)

이펙티브 c#

아이템 18: 반드시 필요한 제약 조건만 설정하라

제약 조건은 제네릭 타입에 대해 우리가 가정하고 있는 사실을 컴파일러와 다른 개발자에게 알려주는 용도로 사용된다.
컴파일러에게 제약조건을 알려준다는것은 System.Object에서 노출하는 수준 이상으로 사용할 수 있음을 알려주는것이다.

제네릭 사용시 컴파일러 입장에서 장점

  • 제네릭 타입을 작성할때 도움이 된다.
  • 제네릭 타입을 사용하는 사용자가 타입 매개변수로 올바른 타입을 지정했는지 컴파일 타임에 확인 가능

제네릭 타입을 작성할 때 필요한 제약 조건이 있다면 반드시 이를 지정하자

제약조건을 최소화 하기 위한 방법

  • 제네릭 타입 내에서 반드시 필요한 기능만을 제약 조건으로 설정

아이템 19: 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라

제네릭의 인스턴스화는 런타임의 타입을 고려하지 않으며 컴파일타임 타입만 고려한다.

특정타입에 대해 더효율적으로 동작한다고 생각된다면 그냥 그타입을 이용하도록 코드를 작성하라.

아이템 20: IComparable[T]와 IComparer[T]를 이용하여 객체의 선후 관계를 정의하라

최신 API는 IComparable을 사용하지만 오래된 API는 IComparer를 사용한다. 따라서 IComparable를 구현할때 IComparer까지 같이 구현해야 한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;

namespace EffectiveCSharp.Item20
{
public struct Customer : IComparable<Customer>, IComparable
{
private readonly string name;

public Customer(string name)
{
this.name = name;
}

public int CompareTo(Customer other) => string.Compare(name, other.name, StringComparison.Ordinal);

public int CompareTo(object obj)
{
if (!(obj is Customer))
{
throw new ArgumentException("argument is not Customer");
}

var otherCustomer = (Customer) obj;

return CompareTo(otherCustomer);
}

public static bool operator <(Customer left, Customer right) => left.CompareTo(right) < 0;
public static bool operator >(Customer left, Customer right) => left.CompareTo(right) > 0;
public static bool operator <=(Customer left, Customer right) => left.CompareTo(right) <= 0;
public static bool operator >=(Customer left, Customer right) => left.CompareTo(right) >= 0;
}
}

제네릭 버전이 아닌 IComparable 인터페이수 구현을 왜하나?

  • 하위 호환성을 위해
  • 일부 Base Class Library는 하위 호환성을 요구한다.

참조