c# - 이유 - 컬렉션을 읽기 전용으로 반환



.net multithreading (5)

다중 스레드 환경에서 정보 수집을 유지하는 객체가 있습니다. 예를 들면 다음과 같습니다.

public IList<string> Data 
{
    get 
    {
        return data;
    }
}

현재 return data; 컬렉션 위반을 방지하기 위해 ReaderWriterLockSlim 로 래핑됩니다. 그러나 이중으로 확실하게하기 위해 컬렉션을 읽기 전용으로 반환하고 싶습니다. 따라서 호출 코드가 컬렉션을 변경할 수 없으며 이미있는 것을 볼 수 있습니다. 가능한가요?


기본 데이터가 목록으로 저장되면 List (T) .AsReadOnly 메서드를 사용할 수 있습니다.
데이터를 열거 할 수 있으면 Enumerable.ToList 메서드를 사용하여 컬렉션을 List로 캐스팅하고 AsReadOnly를 호출 할 수 있습니다.


나는 당신의 받아 들여진 응답을 투표하고 그것으로 동의한다 - 그러나 나는 당신에게 무언가를 고려할지도 모르다?

컬렉션을 직접 반환하지 마십시오. 컬렉션의 목적을 반영하는 정확한 이름의 비즈니스 논리 클래스를 만듭니다.

이것의 가장 큰 장점은 컬렉션에 코드를 추가 할 수 없다는 것입니다. 따라서 오브젝트 모델에 원시 "컬렉션"이있을 때마다 프로젝트에 액세스 할 때 항상 비 OO 지원 코드가 확산됩니다.

예를 들어, 콜렉션이 인보이스 인 경우, 미지급 인보이스를 반복 한 코드에 3 ~ 4 개의 위치가있을 수 있습니다. getUnpaidInvoices 메소드를 사용할 수 있습니다. 그러나 실제 능력은 "payUnpaidInvoices (payer, account);"와 같은 메소드를 생각할 때 시작됩니다.

객체 모델을 작성하는 대신 컬렉션을 전달할 때 전체 리팩토링 클래스는 결코 발생하지 않습니다.

또한 이것은 당신의 문제를 특히 좋게 만듭니다. 사람들이 컬렉션을 변경하지 못하도록하려면 컨테이너에 변형자를 포함 할 필요가 없습니다. 나중에 한 가지 경우에 실제로 수정해야한다고 결정하면 안전하게 수행 할 수있는 메커니즘을 만들 수 있습니다.

네이티브 컬렉션을 전달할 때 어떻게 그 문제를 해결할 수 있습니까?

또한 네이티브 모음을 추가 데이터로 향상시킬 수 없습니다. 다음 번에 하나 또는 두 가지 방법으로 (콜렉션, 엑스트라)를 전달한다는 것을 알게 될 것입니다. "Extra"는 컬렉션을 포함하는 개체와 관련이 있음을 나타냅니다.


대신 컬렉션의 사본을 사용할 수 있습니다.

public IList<string> Data {
get {
    return new List<T>(data);
}}

그런 식으로 업데이 트되면 그것은 중요하지 않습니다.


유일한 의도는 실수를하지 않도록 호출 코드를 가져오고 필요한 모든 것을 읽어야하는 경우 컬렉션을 수정하면 추가, 제거 등을 지원하지 않는 인터페이스를 반환하는 것입니다. IEnumerable<string> 반환하지 않는 이유는 무엇입니까? IEnumerable<string> ? 호출 코드는 액세스해야하는 속성의 내부를 모른 채로 수행 할 가능성이없는 캐스팅해야합니다.

그러나 호출 코드가 다른 스레드의 업데이트를 관찰하지 못하도록하려는 경우 이미 언급 된 솔루션으로 폴백해야합니다. 필요에 따라 딥 (deep) 또는 얕은 (shallow) 복사본을 수행해야합니다.


yield 키워드를 사용하려고합니다. IEnumerable 목록을 반복하고 yeild를 사용하여 결과를 반환합니다. 이를 통해 소비자는 컬렉션을 수정하지 않고 for each를 사용할 수 있습니다.

다음과 같이 보일 것입니다 :

List<string> _Data;
public IEnumerable<string> Data
{
  get
  {
    foreach(string item in _Data)
    {
      return yield item;
    }
  }
}




concurrency