2010-04-26 5 views
4

와 방법에서 ReadOnlyCollection을 반환 I가 다음과 같은 코드 :는 IList의 반환 형식 여기

private IList<IState> _states = new List<IState>(); 
    private ReadOnlyCollection<IState> _statesViewer; 

    public IList<IState> States { get { return _statesViewer; } } 
내가 일반적으로는 구체적인 클래스 자체보다는 인터페이스를 반환하는 것이 바람직하다고 생각

하지만,이에 이 경우 States 속성 ReadOnlyCollection의 반환 유형으로 설정하면 안됩니다.

내 라이브러리 사용자는 내가 설정 한 경우 IList으로 할 수있는 모든 작업을 수행 할 수 있다고 생각합니다. 이는 요소 추가를 의미합니다. 그것은 사실이 아니며 나는 IList로서 그것을 드러내는 계약을 확실히 깨고 있습니다.

이보기가 맞았나요? 제가 여기에없는 다른 것이 있습니까?

답변

6

API를 가장 명확하게 만듭니다. 호출자가 열거해야하는 경우 IEnumerable<T>으로 노출 될 수 있지만 ReadOnlyCollection으로 표시하는 것에 대해서는 신경 쓰지 않습니다. 당신이 나에게 있었다면

3

, 나는 단순히

IEnumerable<IState> 
2

IEnumerable<T>로 노출 될 수 물론, 단지 인덱서 및 열거와 사용자 정의 유형 (인터페이스 또는 클래스)를 선언 할 수있는 것은 공공을위한 좋은 선택이다 시퀀스를 나타내는 속성

시퀀스가 ​​여전히 가능한 가장 작은 계약으로, 분리 된 상태로 유지하는 데 도움이됩니다.

개체를위한 Linq에서 풍부한 작업을 수행 할 수 있으므로 소비자에게 많은 힘을 제공 할 수 있습니다.

2

사람들이 의 경우에만으로 실행하는 경우에만 IEnumerable<IState>을 가져 오는 경우가 있습니다. 하지만 인덱스 연산자, Count, Contains, IndexOf 등과 같은 외부 세계에 대한 몇 가지 기본 제공 기능이 필요하다면 ReadOnlyCollectionIList으로 지정하고 문서 내에 읽기 전용이라고 적어 두십시오.