반 컬렉션을 읽기 전용으로
-
09-06-2019 - |
문제
나는 객체에는 다중 스레드 환경을 유지하는 정보의 수집,예를 들어:
public IList<string> Data
{
get
{
return data;
}
}
나는 현재 return data;
에 의해 래핑 ReaderWriterLockSlim
을 보호하 컬렉션에서 공유합니다.그러나,이중 물론,난로 돌아가고 싶은 컬렉션을 읽기 전용으로,그래서 코드를 호출할 수 없는 내용을 변경하여 수집,보기만 무엇이 이미 있습니다.이 모든 가능한가요?
해결책
하는 경우에만 의도를 얻을 호출하는 코드를 잘못하지 않습니며,컬렉션을 수정할 때에만 읽을 필요한 모든 것은 반환하는 인터페이스를 지원하지 않을 추가,제거,등등....왜 돌아 IEnumerable<string>
?전화 코드를 캐스팅해야하는,그들은 가능성을 모르고 내부 시설들이 있습니다.
그러나 당신의 의도를 막는 전화 코드에서 관찰하는 업데이트를 다른 스레드에서 당신이 다시 떨어 솔루션에 이미 언급했듯이,을 수행하거나 복사본에 따라 필요합니다.
다른 팁
하는 경우 기본 데이터가 저장된 목록으로 사용할 수 있는 목록(T).AsReadOnly 방법입니다.
는 경우에 데이터를 열거할 수 있 사용할 수 있습니다 열거.ToList 방법 이전 컬렉션의 목록과 통화 AsReadOnly 니다.
저는 투표에 대한 귀하의 수락 응답에 동의 그것으로-그러나 수도 내가 당신에게 무언가를 고려해야 하는가?
으로 돌아오지 않는 컬렉션을 직접 있습니다.을 정확하게 이라는 비즈니스 로직 클래스의 컬렉션입니다.
의 주요 장점이 온다는 사실에할 수 없습니다 추가 코드 컬렉션을 때마다 그래서 당신이 네이티브"컬렉션에서"당신의 개체 모델,당신은 항상 당신 비 OO 지원 코드를 확산을 통해 귀하의 프로젝트를 액세스할 수 있습니다.
예를 들어,귀하의 컬렉션 청구서,당신은 아마는 3 개 또는 4 곳에서 당신의 코드를 통해 반복 미지급된 송장을 이메일로 보낼 수 있습니다.할 수 있습 getUnpaidInvoices 방법입니다.그러나 전에 생각하기 시작할 때의 방법이 다음과 같"payUnpaidInvoices(담자,계정);".
당신이 통과 할 때 주변의 컬렉션을 쓰는 대신에 객체 모델,전체 클래스의 리팩토링이 발생하지 않습니다.
참고 또한 이것은 당신의 문제에 특히 좋다.원하지 않는 경우에 사람들이 변화하는 컬렉션은,당신의 용기가 필요 포함하지 않는 뮤 테이터.당신이 나중에 결정에 하나의 경우에 당신은 실제로 있을 수정할 수 있습니다 만들기 안전 메커니즘을니다.
어떻게 당신이 그 문제를 해결할 때 당신은 주위에 통과 네이티브 컬렉션?
또한,기본 컬렉션을 할 수 없으로 강화될 여분의 데이터입니다.당신은 이를 인식하는 다음 시간 당신에 통과(컬렉션,별도)보다 더 중 하나 또는 두 가지 방법이 있습니다.을 나타내는"추가"속으로 포함하는 개체의 모음입니다.
나는 당신이 혼란 개념을 여기에.
이 ReadOnlyCollection
제공하는 읽기 전용 래퍼는 기존의 컬렉션을 할 수 있도록,(Class A)에 통과한 참조하여 컬렉션에서 안전하는 발신자(Class B)를 수정할 수 없습니다 컬렉션(i.e할 수 없 추가 나 제거 모든 요소에서 컬렉션입니다.)
은 절대적으로 존재하지 않는 스레드에 안전성을 보장합니다.
- 는 경우(Class A)수정을 계속하는 기본 컬렉션한 후 손으로 그것을 밖으로
ReadOnlyCollection
다음 클래스 B 볼 것이 이러한 변경 사항이 어떤 반복기를 무효화,등등.일반적으로 열려있는 모든 일반적인 동시성 문제와 컬렉션이 있습니다. - 또한,만약에 있는 요소 컬렉션은 변하기 쉬운 모두 당신이(클래스) 고 발신자(Class B)을 변경할 수 있습니다 모든 변경 가능한 상태의 개체 내의 컬렉션입니다.
의 구현의 요구에 따라 달라집-당신은 당신에 대해 걱정하지 않는 발신자(Class B)보고에서 어떠한 추가 변경이 컬렉션할 수 있습니다 그냥 복제 컬렉션의 손으로 그것을 밖으로,그리고 중지 배려입니다.-만약 당신은 확실히 필요 발신자(Class B)에 참조 변경 내용은 컬렉션이 원하는 스레드에 안전,당신은 더 많은 문제가에 당신의 손에 있습니다.하나의 가능성을 구현하는 것입니다 당신의 자신의 스레드에 안전한 변형의 readonlycollection 을 허용 잠금에 액세스하지만,이 것이 아닌 사소한과 비 성능이 지원하려는 경우페이,그리고 아직도 지 않을 보호에 대하여 변경 가능한 요소 컬렉션입니다.
하나는 aku의 응답을 목록으로 읽기 전용입니다.요소의 목록에서 여전히 매우 쓰기 권한이 없습니다.내가 알지 못하는 경우가 있는 어떤 방법을 보호하 non-원자 요소 없이 복제들에 배치하기 전에 읽기만 목록이다.
당신이 사용하고 싶 수율 키워드입니다.당신 루프를 통해페 목록하고 그 결과를 반환하는 함께 항복.이를 통해 소비자를 사용하여 각을 수정하지 않고의 컬렉션입니다.
그것은 다음과 같이 보일 것이다:
List<string> _Data;
public IEnumerable<string> Data
{
get
{
foreach(string item in _Data)
{
return yield item;
}
}
}
당신이 사용할 수 있는 복사본을의 컬렉션을 대신 합니다.
public IList<string> Data {
get {
return new List<T>(data);
}}
는 경우 그것은 중요하지 않습니다.