2011-01-13 7 views
9

의 목록을 내가 List -property와 함께 몇 가지 클래스가 :읽기 전용 C#을

class Foo { 
    private List<int> myList; 
} 

내가 읽기 전용이 분야에 대한 액세스를 제공합니다.

e.e. Enumerable, Count 등의 액세스 권한이 있고 Clear, Add, Remove 등의 액세스 권한이없는 속성을 원합니다. 어떻게 처리 할 수 ​​있습니까?

+0

나는 머리를 가서의 제목을 변경거야 read-only와 immutability는 두 가지 매우 다른 주제이기 때문에이 질문은 읽기 전용입니다. 우리가 그들을 섞지 않았다면 나는 그것을 선호합니다. 불변성을 찾고 있다면 http://stackoverflow.com/a/9009748/58961을 확인하십시오. –

답변

25

목록의 읽기 전용보기를 원할 경우 ReadOnlyCollection<T>을 사용할 수 있습니다.

class Foo { 
    private ReadOnlyCollection<int> myList; 
} 
+3

또는 좀 더 정확하게 말해, 개인용'List '변수와 공개'ReadOnlyCollection ' 속성에 변수를 반환하는'get {}'이 있습니다. –

+3

@Victor : 간단한 캐스트로 호출 가능한 코드에 변경 가능한 목록에 대한 액세스 권한을 부여합니다. OP가 원하는 것이 아닌 것 같습니다. readonly 속성은'new ReadOnlyCollection (myList);를 반환 할 수 있습니다. –

+8

ReadOnlyCollection은 원래 목록에 대한 포인터가 포함되어 있으므로 실제로 변경할 수 없습니다. 목록에 항목을 추가하면 readOnly-instance는이 새 항목에 액세스 할 수 있지만 수정 사항이 발생하면 올바른 것입니다. 메소드 - 이것들은 없다! –

0

클래스에 읽기 전용 목록을 선언해도 계속 항목을 추가 할 수 있습니다.

아무 것도 추가하거나 변경하지 않으려면 Darin이 제안한대로 ReadOnlyCollection<T>을 사용해야합니다.

목록에서 항목을 제거하지만 내용을 변경하지 않으려면 readonly List<T>을 사용할 수 있습니다.

9

내가 방법을 사용하여 당신은 ReadOnlyCollection<T>List<T>에 노출 될 수 있습니다

public sealed class Foo 
{ 
    private readonly List<object> _items = new List<object>(); 

    public IEnumerable<object> Items 
    { 
     get 
     { 
      foreach (var item in this._items) 
      { 
       yield return item; 
      } 
     } 
    } 
} 
+4

왜 결국 수익률이 나 빠지나요? –

+0

Foo는 IEnumerable – Turowicz

+0

@Jon Skeet을 구현할 수 있습니다. 과거 사본 ... 처음에는 '// TODO'가 있었지만 foreach로 바꿨습니다 ... 힌트를 주셔서 감사합니다! –

8

갈 것 AsReadOnly()

class Foo { 

    private List<int> myList; 

    public ReadOnlyCollection<int> ReadOnlyList { 
    get { 
     myList.AsReadOnly(); 
    } 
    } 
} 

깔끔한 것은 당신이 추가하면/개인 목록에서 아무것도를 제거하는 것입니다 또한 반환 된 ReadOnlyCollection에 반영됩니다.

+0

깔끔하고 정확하게 내가 원한 것입니다. – AnthonyVO

5

정확히 이제는 불변의 컬렉션 라이브러리가 있습니다. 너 게 (nuget)를 통해 설치할 수 있습니다.

불변의 컬렉션 클래스는 .NET 프레임 워크 4.5부터 지원됩니다.

https://msdn.microsoft.com/en-us/library/dn385366%28v=vs.110%29.aspx

System.Collections.Immutable 네임 스페이스를 포함하여 이러한 시나리오에 사용할 수있는 일반적인 불변 수집 유형을 제공합니다 ImmutableArray <T>, ImmutableDictionary < TKEY, TValue >, ImmutableSortedDictionary <T>, 변경 불가능한 해시 세트 <T>, ImmutableList <T>, ImmutableQueue <T>, ImmutableSortedSet <T>, ImmutableStack < T 사용의 >

예 :

class Foo 
{ 
    public ImmutableList<int> myList { get; private set; } 

    public Foo(IEnumerable<int> list) 
    { 
     myList = list.ToImmutableList(); 
    } 
}