어레이가 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는 이름 .List
IMO입니다.
- 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
'더하기는 안 해요. '더하기'는 안 해요.IList
Array
;;;;;;;;Array
를 실장하다IList
배열로서
예외는 인터페이스가 정의하는 것과 동일합니다.단일 방식뿐만 아니라 인터페이스 전체를 알고 있다면 놀랄 일도 아닙니다., 이 에서는, ,, 이, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, the, 음, 음, the, the, the를 확인할 수 .IsFixedSize
를 확인해 주십시오.Add
★★★★★★ 。
언급URL : https://stackoverflow.com/questions/5968708/why-array-implements-ilist
'programing' 카테고리의 다른 글
PowerShell에서 명령줄 인수를 처리하는 방법 (0) | 2023.04.20 |
---|---|
SQL Server에 저장된 업데이트 프로시저를 삽입합니다. (0) | 2023.04.15 |
C# 리스트내림차순 (0) | 2023.04.15 |
파일을 WPF로 드래그 앤 드롭 (0) | 2023.04.15 |
데이터베이스에 대한 트랜잭션 로그가 가득 찼습니다. (0) | 2023.04.15 |