2011-10-11 2 views
4

해당 배열은 바이트 스트림입니다. 배열 만 반환하는 문제는 읽기 전용이 아니므로 라이브러리의 클라이언트가 내용을 수정할 수 있다는 것입니다. 배열 대신 라이브러리에서 반환 할 컬렉션 유형은 무엇입니까?

IEnumerable, IList, List, ReadOnlyCollection, Collection, et cetera.

또한, 반환 형식은 실제 인스턴스 유형 다를 수 있습니다 : 내가 선택해야할지 모르겠어요 배열 포장의 많은 다른 방법이

있습니다. 내 초기 접근 방식

은 다음과 같이 뭔가를했다 :

data 바이트 배열입니다

Data = new ReadOnlyCollection<byte>(data);

. Data 속성은 일부 인터페이스 유형 (IEnuerable, IList 등)이 될 것입니다. 그러나 사용할 항목이 확실하지 않습니다. 꽤 많은 표준 인 IEnumerable을 추천합니다. 그러나 여기서는 순서가 중요하며, 바이트 스트림은 배열과 구문상의 유사성을 유지해야합니다. IEnumerable은 개별 표시의 액세스를 허용하지 않으므로 여기서 분명히 최적의 선택이 아닙니다.

IList가 읽기 전용이 아니므로 ICollection이 정확하다고 생각하십니까? 확실하지 않습니다. 너무 많은 콜렉션 유형이있는 것 같고 사용법에 관해서는 다소 혼란스러워집니다.

답변

2

나는 IList<byte>을 반환하고 목록이 불변이라는 문서로 유혹 될 것이다. 나중에 구현 변경의 융통성이 혼합되어 있지만 호출자는 IEnumerable<T>의 "최소 공통 분모"로 작업 할 필요가 없습니다.

선언 유형으로 IList<byte>을 사용하면 ReadOnlyCollection<byte>을 구현으로 반환 할 수 있습니다.

또는 대린 언급, 당신이 사용할 수있는 Stream - 특히, MemoryStream : 읽기 전용 스트림 될 것

return new MemoryStream(data, false); 

. 클라이언트가 을 원할 경우 데이터를 스트림으로 (예 : XML 파서 또는 이미지 로더 등으로 전달) 읽으면 가장 좋을 것입니다. Stream을 반환하는 것으로 선언해야합니다. 호출자가 ToArray을 호출하기를 원하지 않는 한, MemoryStream을 반환한다는 명시 적 선언에 거의 도움이되지 않습니다. 리턴 된 스트림은 읽기 쉽고 탐색 가능하지만 쓰기 불가능하다는 것을 문서화해야한다.

실제로 컬렉션으로 취급하려는 경우 IList<T>이 좋습니다.

1

바이트 배열 대신 Stream을 직접 반환하는 것은 어떻습니까? 고객이 결과를 통해 무엇을 할 수 있는지에 따라 다양한 접근법이있을 수 있습니다. 바이트 배열을 수정할 수 있다면 정말 나쁠까요? IEnumerable<T>을 반환하더라도 여전히 .ToArray() 확장 메서드를 호출하고 바이트 배열을 가져올 수 있습니다. 따라서 소비자의 메모리 내 배열을 수정하면 문제가 될 것이라고 생각하지 않습니다.

+1

개체가 데이터를 "소유"하고 사람들이 데이터를 변경할 수있게하려는 경우 큰 문제입니다. 그렇습니다. ToArray를 호출하여 사본을 만들 수는 있지만, 그렇지 않은 경우가 있습니다. 필요하지 않은 경우 사본을 만들어야하는 것은 부끄러운 일입니다. 'MemoryStream'과'ReadOnlyCollection '모두 앞쪽에 더 좋습니다. –

1

나는 MemoryStream을 반환 할 것을 제안합니다. 읽기 전용으로 구성 할 수 있습니다.

관련 문제