2010-03-03 3 views
3

인터페이스에는 Add, RemoveInsert과 같은 SortedList<TKey, TValue>.Keys 속성에서 지원하지 않는 작업 외에도 인덱스 별 액세스가 포함됩니다.왜 SortedList (TKey, TValue) .Keys 속성이 ReadOnlyCollection (TKey)이 아닌 IList (TKey)입니까?

ReadOnlyCollection<T>이 같은 List<T>.AsReadOnly의 반환 값으로, IList<T> 구현하기 때문에 인덱스 에 의해 액세스를 제공하지만, 명시 적으로을 구현하여 Add, 등과 같은 불법 작업을 숨 깁니다. 게다가 그것은 단지 기본 목록을위한 래퍼 일뿐입니다. 따라서 복사본을 만들지 않으므로 실제 성능이 저하되지 않도록해야합니다.

SortedList<TKey, TValue.KeysReadOnlyCollection<TKey>이 아닌지 알고 싶습니다. (그 이유에 대해 Values 속성이 ReadOnlyColllection<TValue>이 아닌 이유는 무엇입니까?)

+0

sortedList.Values.Add (2);를 수행하면 읽기 전용 컬렉션이 아닌 것이 이상합니다. 그것은 예외를 던졌습니다 – Andrey

+0

정확 하 게! 매우 궁금해서 ... –

+0

그 이유는 ReadOnlyCollection이 인터페이스가 아니라는 것입니다. 당신이 쓸 수있는 인터페이스를 가지고 있지만, ReadOnlyCollection은 자신 만 가지고 있습니다. – Andrey

답변

3

이것은 꽤 잘 보이지 않지만 이것이 최적화라고 생각합니다. 그것은 제네릭이 구현되는 방식과 관련이 있습니다. 제네릭 클래스 메소드의 기계 코드는 JIT 컴파일러에 의해 런타임에 작성됩니다. 그것은 그것의 몇몇 구체적인 버전을 만들어야합니다. 참조 유형에는 하나가 있습니다. 그리고 프로그램에서 사용되는 모든 단일 값 형식 인수에 대해 하나씩.

비효율적 일 수 있으며 잠재적으로 많은 코드를 생성해야합니다. 일반적인 프레임 워크 클래스에 특히 좋지 않은 Ngen-ed입니다. 구체적인 메소드 구현은 JIT 컴파일이어야하며 Ngen 이미지에있을 수 없습니다.

프레임 워크에 비공개 코드가 있습니다 (죄송합니다, 어디에서 깜빡했는지), 다양한 버전의 일반 클래스를 인스턴스화합니다. 재미있는 무언가 코드, 꽤 당황 스럽다. 그러나 Ngen.exe가 제네릭 클래스 메서드에 대한 코드를 생성한다는 부작용이 있습니다. 자신의 코드에서 이러한 제네릭 클래스를 사용하면 Ngen 이미지에서 메서드를 구체적으로 구현할 수 있습니다. JIT 컴파일러는 필요하지 않습니다.

이 리드에서 System.Collections.ObjectModel.ReadOnlyCollection이이 목록에 포함되지 않을 가능성이 높습니다. 쉽게 검증 할 수 있습니다. 참조 방법 소스가 .pdbs 인 경우에도 소스 코드를 한 번만 들여다 보면 소스 코드로 넘어 가지 않습니다.

정확한 설명이 100 % 아닙니다. 그러나 신발은 맞습니다.

+0

매우 흥미롭고 유용한 답변입니다. 이렇게 심오한 것을 기대했습니다. 이제 나는 당신이 말하는 것에 대해 나 자신을 파헤 치려고합니다. –

관련 문제