구성원이 상황에 무의미 할 때 그렇게하는 것이 좋습니다. 예를 들어 IList<T>
내부 객체에 위임하여 구현 되는 읽기 전용 컬렉션을 만들면 _wrapped
다음과 같은 내용이있을 수 있습니다.
public T this[int index]
{
get
{
return _wrapped[index];
}
}
T IList<T>.this[int index]
{
get
{
return this[index];
}
set
{
throw new NotSupportedException("Collection is read-only.");
}
}
public int Count
{
get { return _wrapped.Count; }
}
bool ICollection<T>.IsReadOnly
{
get
{
return true;
}
}
여기 네 가지 사례가 있습니다.
public T this[int index]
는 인터페이스가 아닌 클래스에 의해 정의되므로 물론 명시 적으로 구현되지는 않습니다.하지만 읽기-쓰기와 유사하다는 점에 유의하십시오. T this[int index]
인터페이스에 정의 된 하지만 읽기 전용입니다.
T IList<T>.this[int index]
그중 일부 (게터)가 위의 속성과 완벽하게 일치하기 때문에 명시 적이며 다른 부분은 항상 예외를 throw합니다. 인터페이스를 통해이 클래스의 인스턴스에 액세스하는 사람에게는 매우 중요하지만 클래스 유형의 변수를 통해 해당 클래스를 사용하는 사람에게는 무의미합니다.
마찬가지로 bool ICollection<T>.IsReadOnly
항상 true를 반환 클래스 유형에 대해 작성된 코드에는 전혀 의미가 없지만 인터페이스 유형을 통해 코드를 사용하는 것이 중요 할 수 있으므로 명시 적으로 구현해야합니다.
거꾸로, public int Count
자체 유형을 통해 인스턴스를 사용하는 사람에게 잠재적으로 사용될 수 있으므로 명시 적으로 구현되지 않습니다.
그러나 "매우 드물게 사용 된"사례의 경우, 명시 적 구현을 사용하지 않는 것이 좋습니다.
클래스 유형의 변수를 통해 메소드를 호출하는 명시 적 구현을 사용하는 것이 권장되는 경우 오류 (인덱스 세터 사용 시도) 또는 무의미 (항상 동일한 값 확인)가 숨겨져 있습니다. 버그가 있거나 최적화되지 않은 코드로부터 사용자를 보호하고 있습니다. 그것은 거의 사용 되지 않을 것이라고 생각하는 코드와 크게 다릅니다 . 이를 위해 EditorBrowsable
속성을 사용하여 멤버를 인텔리전스에서 숨기는 것을 고려할 수도 있습니다 . 사람들의 뇌에는 이미 관심없는 것을 걸러 내기위한 자체 소프트웨어가 있습니다.