2016-09-28 1 views
1

오늘 나는 the harm of arrays을 설명하는 Eric Lippert의 게시물을 읽었습니다. 값 집합이 필요할 때 값인 변수 값이 아닌 값을 제공해야한다고 언급했습니다.IList가 실제로 어레이의 더 나은 대안인가요?

  1. 이 가능
  2. 가 반복하는 항목을 수 있습니다 인덱스 액세스 : 그래서 에릭은 우리가하는 방법에있는 항목의 컬렉션을 반환 할 때마다, 우리는 즉 그것은, 배열과 같은 기능을 제공하는 IList<T>을 반환해야 함을 시사한다
  3. 강하게리스트는 항목을 추가하거나 제거함으로써 컬렉션 오브젝트를 수정 부재를 제공하는 배열을 달리하지만

를 입력한다. 당연히 컬렉션을 ReadOnlyCollection으로 랩하고 IEnumerable<T>을 반환 할 수는 있지만 인덱스 된 액세스 가능성을 잃게됩니다. 또한 호출자는 ReSharper 경고 "동일한 열거 형의 가능한 반복"이 적용되는지 여부를 알 수 없으므로 열거 형은 내부적으로 열거 형이 ReadOnlyCollection에 싸여 있음을 알지 못합니다. 따라서 호출자는 콜렉션이 이미 구체화되었는지 여부를 알 수 없습니다.

그래서 컬렉션 자체가 변경 될 수없는 항목들의 컬렉션 (아이템은 아니지만, 그들은 IList에 있지 않습니다)은 우리가 추가/제거/삽입 할 수 없음을 의미합니다. 항목을 기본 목록에 추가합니다. 그러나 내 API에서 ReadOnlyCollection을 반환하는 것이 이상하게 보입니다. 적어도 API는 본 적이 없습니다.

이렇게 배열은 내 필요에 완벽하게 보입니다. 그렇습니까?

+0

도 그런 경우를위한 새로운 인터페이스'IReadOnlyList '가 ... – Jehof

+0

@Jehof는 죄송합니다'array'의 .NET3.5 – HimBromBeere

+0

장점을 언급하는 것을 잊었다입니다 당신의'foreach' 루프를 수행 할 때 'array' 레퍼런스 (메모리에있는 구체적인 객체가 아니라 레퍼런스에 대해 말하고 있습니다)를 사용하면 컴파일러는 자동으로이를 for 루프로 변환합니다. – krimog

답변

1

우리는 물론 IEnumerable<T>

왜 그렇게하는 A ReadOnlyCollection로 컬렉션을 포장하고 반환 할 수? ReadOnlyCollection<T>IList<T>을 구현하므로 더 좋은 방법이 없으면 IList<T>이라는 반환 유형을 선언하고 ReadOnlyCollection<T>의 인스턴스를 반환하는 것이 좋은 방법 인 것 같습니다.

그러나 현재 .NET Framework 버전에서는 ReadOnlyCollection<T>의 인스턴스를 반환하지만 IReadOnlyList<T>의 반환 형식을 지정하는 것이 좋습니다. IList<T>은 실제로 발신자가 수정하도록 허용하지 않지만 IReadOnlyList<T>은 의도를 명시 적으로 나타냅니다.

+0

아, 인터페이스를 구현한다는 사실을 잊어 버렸습니다. 이제 API 클라이언트가 반환 된 값에 대해 'Add'를 호출하면 예외가 발생하지만 이상하게 보일 수 있습니다. 힌트를 가져 주셔서 감사합니다. – HimBromBeere

+1

@HimBromBeere 그게 바로 IsReadOnly 속성에 대한 것입니다. – krimog