programing

어레이가 IList를 구현하는 이유

testmans 2023. 4. 15. 08:30
반응형

어레이가 IList를 구현하는 이유

시스템의 정의를 참조해 주세요.배열 클래스

public abstract class Array : IList, ...

이론상으로는 이 비트를 쓸 수 있고 행복할 수 있을 것이다.

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

iList에서 어떤 메서드라도 호출할 수 있어야 합니다.

 ilist.Add(1); //exception here

문제는 예외를 두는 이유가 아니라 어레이가 IList를 구현하는 이유입니다.

인덱스에 에, 「」는 「」를 참조해 주세요.IList/IList<T>이 기능을 지원하는 유일한 수집 인터페이스입니다.그렇다면 진짜 질문은 "인덱서와의 지속적인 수집을 위한 인터페이스가 왜 없는가?" 맞다. 그리고 할 수 없다.을 사용법

수집을 위한 읽기 전용 인터페이스도 없습니다.그리고 인덱서 인터페이스에서는 일정 크기 이상의 기능이 없습니다.

IMO이름 .ListIMO입니다.

  • Enumeration Just Enumeration(단순 열거)IEnumerable<T>
  • 읽기 전용이지만 인덱서는 없습니다.count, .contains,
  • 를 조정할 수 인덱서가 . ( 전류는 (추가, 삭제로됩니다.ICollection<T>
  • 인덱서(인덱서, 인덱스,...)를 사용한 읽기 전용
  • 인덱서를 사용한 고정 크기(세터가 있는 인덱서)
  • 인덱서 크기 덱(삽,...) 현IList<T>

현재의 컬렉션 인터페이스는 디자인이 나쁜 것 같습니다.그러나 어떤 방법이 유효한지를 알려주는 속성을 가지고 있기 때문에(이러한 방법의 계약 중 일부이기도 합니다), 대체 원칙을 위반하지 않습니다.

설명서의 비고 섹션:IList라고 말합니다

IList는 ICollection 인터페이스의 하위 인터페이스로 모든 비일반 목록의 기본 인터페이스입니다.IList 구현은 읽기 전용, 고정 크기 및 가변 크기의 세 가지 범주로 나뉩니다.읽기 전용 IList는 수정할 수 없습니다.고정 크기 IList에서는 요소를 추가하거나 제거할 수 없지만 기존 요소를 수정할 수 있습니다.가변 크기 IList를 사용하면 요소를 추가, 제거 및 수정할 수 있습니다.

어레이는 고정 크기 범주에 속하기 때문에 인터페이스의 정의에 따라서는 의미가 있습니다.

모든 것이 변동 가능한 것은 아니기 때문입니다( 참조).IList.IsFixedSize ★★★★★★★★★★★★★★★★★」IList.IsReadOnly어레이는 확실히 고정 사이즈 리스트와 같이 동작합니다.

정말로 「일반적이지 않은 인터페이스를 실장하는 이유」라고 하는 질문이라면, 이러한 인터페이스는 제네릭이 등장하기 전에 이미 존재하고 있었기 때문입니다.

읽기 전용 컬렉션의 처리 방법과 어레이가 읽기 전용인지 아닌지가 명확하지 않았던 시대의 유산입니다.IList 인터페이스에는 IsFixedSize 플래그와 IsReadOnly 플래그가 있습니다.IsReadOnly 플래그는 컬렉션을 전혀 변경할 수 없음을 의미하며 IsFixedSize는 컬렉션을 수정할 수 있지만 항목을 추가하거나 제거할 수 없음을 의미합니다.

당시에.Net 4.5에서는 읽기 전용 컬렉션을 사용하기 위해서는 일부 "중간" 인터페이스가 필요하다는 것이 명확했습니다.IReadOnlyCollection<T>그리고.IReadOnlyList<T>도입되었습니다.

자세한 내용은 에서 읽기 전용 컬렉션에 대해 설명하는 훌륭한 블로그 게시물을 참조하십시오.네트워크

IList 인터페이스의 정의는 "인덱스로 개별적으로 액세스할 수 있는 일반적이지 않은 개체 집합을 나타냅니다."입니다.어레이는 이 정의를 완전히 충족하므로 인터페이스를 구현해야 합니다.Add() 메서드를 호출할 때의 예외는 "System"입니다.지원되지 않음예외:수집은 고정 크기"로, 어레이가 용량을 동적으로 늘릴 수 없기 때문에 발생했습니다.이 용량은 어레이 개체를 생성하는 동안 정의됩니다.

IEnumerable을 IList/ICOLection으로 캐스팅하면 어레이에서도 사용할 수 있기 때문에 어레이에 IList(및 일시적으로 ICollection)를 구현하면 Linq2Objects 엔진이 간소화됩니다.

예를 들어, Count()는 Array를 호출합니다.ICollection에 캐스팅되고 어레이 구현에서 Length를 반환하므로 후드 아래의 길이입니다.

이 기능이 없으면 Linq2Objects 엔진은 어레이에 대해 특별한 처리를 하지 않고 성능을 저하시키거나 IList와 마찬가지로 어레이에 대해 특별한 대소문자를 처리하는 코드를 두 배로 추가해야 합니다.그 대신 어레이를 IList로 구현하기로 선택했을 것입니다.

그게 바로 'Why'에 대한 저의 견해입니다.

구현 상세 LINQ Last checks for IList. 목록을 구현하지 않은 경우 모든 마지막 콜의 속도를 늦추거나 Last on a Array가 O(N)를 수신하도록 해야 합니다.

Array의 많은 가능한 구현 중 하나일 뿐입니다.IList.

코드는 느슨하게 결합되어야 하기 때문에 추상화 등에 의존해야 한다.★★★★★★★★★★★★★★의 구체적인 IList하는 것을 '배열'이라고 .Array '더하기는 안 해요. '더하기'는 안 해요.IListArray;;;;;;;;Array를 실장하다IList배열로서

예외는 인터페이스가 정의하는 것과 동일합니다.단일 방식뿐만 아니라 인터페이스 전체를 알고 있다면 놀랄 일도 아닙니다., 이 에서는, ,, 이, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, the, 음, 음, the, the, the를 확인할 수 .IsFixedSize를 확인해 주십시오.Add★★★★★★ 。

언급URL : https://stackoverflow.com/questions/5968708/why-array-implements-ilist

반응형