문제

나는 객체에는 다중 스레드 환경을 유지하는 정보의 수집,예를 들어:

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);
}}

는 경우 그것은 중요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top