2009-10-26 4 views
0

저는 C#을 처음 사용합니다. 컬렉션 사용의 차이점을 알고 싶습니다. 나는 다음과 같은 질문을하기 전에 요청할 수 있다고 생각합니다 (친절하게도 저에게 링크를 보여주십시오). 왜 내가 인터페이스를 통해 내 컬렉션을 노출해야인터페이스를 통한 콜렉션 노출

IList<int> intCollection = new List<int>(); 

List<int> intCollection = new List<int>(); 
  1. 사이의 차이는 무엇

    .

  2. 첫 번째 접근 방법을 선택하기위한 종합적인 설탕인가?
  3. 나중의 접근 방법을 사용한다면 어떤 단점이 있습니까?
  4. 해당하는 인터페이스가 존재하는 경우 해당 인터페이스를 사용하여 간접적으로 모든 컬렉션 클래스를 으로 초기화해야합니까?
  5. 인터페이스를 통해 컬렉션을 노출하는 경우의 이점을 알려주세요.

답변

5

인터페이스를 사용하면 발신자를 깨지 않고 지원을 변경할 수 있습니다.

예제의 두 행은 동일한 것으로 간주되지만 IList<T>을 속성으로 표시하면 변경해야하는 코드를 호출하지 않고 반환되는 내용을 정확하게 변경할 수 있습니다.

List<int>을 속성으로 사용하는 클래스가 있다고 가정합니다. 나중에이 항목에 항목이 추가 될 때 발생하는 이벤트를 처리해야한다는 것을 알게 될 때까지 모두 괜찮습니다. 당신은 할 수 없습니다; 속성 유형을 변경해야하므로이를 호출하는 모든 코드를 변경해야합니다. 처음에 IList<int>을 선언하면 구체적인 구현을 다른 것으로 변경할 수 있습니다 (여전히 인터페이스를 지원하는 한).

이것은 StyleCop에 의해 픽업되고 this question으로 처리되었습니다.

+0

여기서 생각할 수있는 예는 C5와 같은 'IList'를 구현하는 다른 콜렉션 라이브러리에서 스왑하는 기능입니다. –

2

인터페이스를 사용하면 나중에 변경할 때 유연성을 얻을 수 있다는 이점이 있습니다. 귀하의 예제에서, IList를 사용하면 나중에 IList의 다른 구현을 사용할 수 있으며 객체 초기화 자만 변경하면됩니다.

또 다른 시나리오는 동일한 인터페이스의 다양한 유형과 상호 작용해야하거나 구현이 완전히 알려지지 않은 코드가있는 경우입니다. 예를 들어, 다른 정렬 알고리즘을 사용해야하고 정렬 요구에 따라 IList의 다른 구현을 사용하려는 전략 패턴. 또는 플러그인 모델을 사용하고 있고 다른 구성 요소가 어떤 구성 요소를 귀하의 API로 전달하는지 알지 못하더라도 IList 계약을 준수하는 ILIST라는 것이 중요합니다.