.NET 4.0의 읽기 전용 목록 또는 수정할 수없는 목록


100

내가 알 수 있듯이 .NET 4.0에는 여전히 읽기 전용 목록이 없습니다. 프레임 워크에 여전히이 기능이없는 이유는 무엇입니까? 이것이 도메인 중심 설계를 위한 가장 일반적인 기능 중 하나가 아닙니까?

Java가 C #에 비해 갖는 몇 가지 장점 중 하나는 Collections.unmodifiablelist (list) 메서드 의 형태 로 IList <T> 또는 List <T>에서 오래 지연된 것 같습니다.

사용 IEnumerable<T>은 질문에 대한 가장 쉬운 해결책 ToList입니다. 사용하여 사본을 반환 할 수 있습니다.


진정한 읽기 전용을 갖는 유일한 실제 방법 List<T>은 직접 작성하는 것 List<T>같습니다. Contains, LINQ 쿼리 등과 같은 즉시 사용 가능한 "읽기 전용"기능을 모두 지원하는 내장 클래스는 없습니다 .
jrh aug

답변:


146

당신이 찾고있는 ReadOnlyCollection.NET2 이후 주변왔다한다.

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

또는

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

이렇게하면 래핑 된 컬렉션의 변경 사항을 반영 하는 읽기 전용 보기 가 생성됩니다 .


1
및 ReadOnlyCollection에 대해 알 수 없습니다 - 나는 바보 조금 지금이 질문을 한 느낌이
크리스 S

54
하지 말라 - 어느 쪽도하지 않았다 I, 나는 귀하의 질문 같은 것을 찾아 가서 발견했을 때
롤랜드 TEPP을

9
그것은 찾기가 귀찮은 수업입니다. 내가 찾을 것으로 예상되는 System.Collections.Generic 대신 System.Collections.ObjectModel 네임 스페이스에 있습니다. Generic 네임 스페이스가 존재하기 전의 위치이기 때문이라고 생각합니다. 그래도 기본 클래스는 ObjectModel에 남아 있고 제네릭 클래스는 Generic에 추가 될 것으로 예상합니다. 이유가 있다고 생각하지만 성가시다.
BlueMonkMN

5
@BlueMonkMN :이 문서 가 Collections.Generic 네임 스페이스와 분리 된 이유를 확인하십시오.
Uchitha

7
그러나 그것은 목록이 아니라 컬렉션입니다. 따라서이를 사용하는 경우 List 대신 Collection을 사용하도록 모든 코드를 수정해야합니다.
Roman Zabicki

13

인터페이스 사용을 좋아하는 사람들을 위해 : .NET 4.5는 예를 들어에서 IReadOnlyList구현되는 일반 인터페이스를 추가합니다 List<T>.

인덱서 속성 IReadOnlyCollection과 유사 하며 추가합니다 Item.



11

목록의 가장 일반적인 패턴이 모든 요소를 ​​반복 IEnumerable<T>하거나 IQueryable<T>읽기 전용 목록으로도 효과적으로 작동 할 수있는 경우입니다.


4
목록을 IEnumerable로 노출하면 소비자는 목록으로 다시 캐스팅하고 수정할 수 있습니다.
JulianR

4
물론 이것은 방탄 조치가 아닙니다. 개인 필드를 읽고 원래 목록을 추적 할 수도 있습니다. 이것은 읽기 전용으로 유지되어야한다는 의도를 설명하는 것과 같습니다.
Ana Betts

5
당신은 호출하여 원래 목록을 수정하지 않는 ToList(), 하나 그냥 복사
크리스 S

참고 IEnumerable이 같은 방법을 포함하지 않는 예를 들어, "읽기 전용"방법의 완전한 세트 아니다 Contains.
jrh

8

2.0에서는을 호출 AsReadOnly하여 목록의 읽기 전용 버전을 가져올 수 있습니다 . 또는 기존 포장 IListA의 ReadOnlyCollection<T>객체입니다.


그것은 Collections.unmodifiablelist (list)와 동일합니다.
Chris S

진정한 List <T> 대신 IList <T>를 사용했기 때문에 .NET 4에서 이것을 놓쳤습니다. List <T>를 처리하는 한 AsReadOnly는 .NET 4에서 계속 사용할 수 있습니다.
BlueMonkMN

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.