development

왜 배열이 IList를 구현합니까?

big-blog 2020. 6. 26. 07:45
반응형

왜 배열이 IList를 구현합니까?


System.Array 클래스 의 정의를 참조하십시오

public abstract class Array : IList, ...

이론적으로, 나는이 비트를 쓸 수 있고 행복해야한다

int[] list = new int[] {};
IList iList = (IList)list;

또한 iList에서 모든 메소드를 호출 할 수 있어야합니다

 ilist.Add(1); //exception here

내 질문은 왜 예외가 아닌 Array가 IList를 구현 하는 이유 입니까?


배열은 인덱스에 의한 빠른 액세스를 허용하고 IList/ IList<T>는이를 지원하는 유일한 컬렉션 인터페이스입니다. 아마도 당신의 실제 질문은 "인덱서가있는 상수 컬렉션을위한 인터페이스가없는 이유"입니다. 그리고 나는 대답이 없습니다.

컬렉션에 대한 읽기 전용 인터페이스도 없습니다. 그리고 인덱서 인터페이스로 일정한 크기 이상의 것을 놓치고 있습니다.

IMO 컬렉션의 기능에 따라 더 많은 (일반적인) 컬렉션 인터페이스가 있어야합니다. 그리고 List인덱서가있는 것은 정말 바보 같은 IMO이기 때문에 이름도 달라야했습니다 .

  • 그냥 열거 IEnumerable<T>
  • 읽기 전용이지만 인덱서 없음 (.Count, .Contains, ...)
  • 크기 조정 가능하지만 인덱서 없음 (예 : (Add, Remove, ...) current와 같이 설정) ICollection<T>
  • 인덱서 (인덱서, indexof, ...)를 사용하여 읽기 전용
  • 인덱서가있는 일정한 크기 (세터가있는 인덱서)
  • 인덱서 (Insert, ...) 전류의 가변 크기 IList<T>

현재 컬렉션 인터페이스가 나쁜 디자인이라고 생각합니다. 그러나 그들은 어떤 방법이 유효한지 알려주는 속성을 가지고 있기 때문에 (이 방법의 계약의 일부 임) 대체 원칙을 어 기지 않습니다.


는 섹션 발언 문서 에 대해 IList말한다

IList는 ICollection 인터페이스의 자손이며 모든 비 제네릭 목록의 기본 인터페이스입니다. IList 구현은 읽기 전용, 고정 크기 및 가변 크기의 세 가지 범주로 분류됩니다 . 읽기 전용 IList는 수정할 수 없습니다. 고정 크기 IList는 요소를 추가하거나 제거 할 수 없지만 기존 요소를 수정할 수는 있습니다. 가변 크기 IList를 사용하면 요소를 추가, 제거 및 수정할 수 있습니다.

분명히 배열은 고정 크기 범주에 속하므로 인터페이스의 정의에 따라 의미가 있습니다.


때문에 모든 IList의는 변경할 수 있습니다 (참조 IList.IsFixedSize하고 IList.IsReadOnly), 및 배열 확실히 고정 된 크기의 목록처럼 동작합니다.

귀하의 질문이 실제로 " 비 제네릭 인터페이스를 구현하는 이유 "인 경우, 제네릭이 나오기 전에 이러한 문제가 발생했다는 것이 답입니다.


읽기 전용 컬렉션을 처리하는 방법과 Array가 읽기 전용인지 여부를 명확하게 알지 못했던 시대부터 우리가 가진 유산입니다. IList 인터페이스에는 IsFixedSize 및 IsReadOnly 플래그가 있습니다. IsReadOnly 플래그는 컬렉션을 전혀 변경할 수 없음을 의미하고 IsFixedSize는 컬렉션이 항목을 추가하거나 제거 할 수는 없지만 수정할 수 있음을 의미합니다.

닷넷 4.5의 시점에서 그렇게 일부 "중간"인터페이스는 읽기 전용 컬렉션으로 작업에 필요하다는 것을 분명 IReadOnlyCollection<T>하고 IReadOnlyList<T>소개되었다.

다음은 세부 사항을 설명하는 훌륭한 블로그 게시물 입니다. .NET의 컬렉션 만 읽기


IList 인터페이스의 정의는 "인덱스로 개별적으로 액세스 할 수있는 비 제네릭 개체 모음을 나타냅니다." 배열은이 정의를 완전히 만족하므로 인터페이스를 구현해야합니다. Add () 메서드를 호출 할 때 "System.NotSupportedException : 컬렉션의 크기가 고정되어 있습니다."예외가 발생하며 배열의 용량을 동적으로 늘릴 수 없기 때문에 발생했습니다. 용량은 배열 객체를 생성하는 동안 정의됩니다.

참고 URL : https://stackoverflow.com/questions/5968708/why-array-implements-ilist

반응형