의 목록을 내가 List
-property와 함께 몇 가지 클래스가 :읽기 전용 C#을
class Foo {
private List<int> myList;
}
내가 읽기 전용이 분야에 대한 액세스를 제공합니다.
e.e. Enumerable, Count 등의 액세스 권한이 있고 Clear, Add, Remove 등의 액세스 권한이없는 속성을 원합니다. 어떻게 처리 할 수 있습니까?
의 목록을 내가 List
-property와 함께 몇 가지 클래스가 :읽기 전용 C#을
class Foo {
private List<int> myList;
}
내가 읽기 전용이 분야에 대한 액세스를 제공합니다.
e.e. Enumerable, Count 등의 액세스 권한이 있고 Clear, Add, Remove 등의 액세스 권한이없는 속성을 원합니다. 어떻게 처리 할 수 있습니까?
목록의 읽기 전용보기를 원할 경우 ReadOnlyCollection<T>
을 사용할 수 있습니다.
class Foo {
private ReadOnlyCollection<int> myList;
}
또는 좀 더 정확하게 말해, 개인용'List
@Victor : 간단한 캐스트로 호출 가능한 코드에 변경 가능한 목록에 대한 액세스 권한을 부여합니다. OP가 원하는 것이 아닌 것 같습니다. readonly 속성은'new ReadOnlyCollection
ReadOnlyCollection은 원래 목록에 대한 포인터가 포함되어 있으므로 실제로 변경할 수 없습니다. 목록에 항목을 추가하면 readOnly-instance는이 새 항목에 액세스 할 수 있지만 수정 사항이 발생하면 올바른 것입니다. 메소드 - 이것들은 없다! –
클래스에 읽기 전용 목록을 선언해도 계속 항목을 추가 할 수 있습니다.
아무 것도 추가하거나 변경하지 않으려면 Darin이 제안한대로 ReadOnlyCollection<T>
을 사용해야합니다.
목록에서 항목을 제거하지만 내용을 변경하지 않으려면 readonly List<T>
을 사용할 수 있습니다.
내가 방법을 사용하여 당신은 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;
}
}
}
}
왜 결국 수익률이 나 빠지나요? –
Foo는 IEnumerable – Turowicz
@Jon Skeet을 구현할 수 있습니다. 과거 사본 ... 처음에는 '// TODO'가 있었지만 foreach로 바꿨습니다 ... 힌트를 주셔서 감사합니다! –
갈 것 AsReadOnly()
class Foo {
private List<int> myList;
public ReadOnlyCollection<int> ReadOnlyList {
get {
myList.AsReadOnly();
}
}
}
깔끔한 것은 당신이 추가하면/개인 목록에서 아무것도를 제거하는 것입니다 또한 반환 된 ReadOnlyCollection에 반영됩니다.
깔끔하고 정확하게 내가 원한 것입니다. – AnthonyVO
정확히 이제는 불변의 컬렉션 라이브러리가 있습니다. 너 게 (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();
}
}
나는 머리를 가서의 제목을 변경거야 read-only와 immutability는 두 가지 매우 다른 주제이기 때문에이 질문은 읽기 전용입니다. 우리가 그들을 섞지 않았다면 나는 그것을 선호합니다. 불변성을 찾고 있다면 http://stackoverflow.com/a/9009748/58961을 확인하십시오. –