본문 바로가기

Programming/.Net

(Workaround) return iterator with 'out' or 'ref' parameters

IEnumerable 반환 메서드에서 yield return을 사용하는 것은 그리 낯설지 않습니다.

그러나 이 경우 out, ref 파라미터를 사용할 수 없다는 제약이 있는데요.

이를 피하는 방법을 찾아서 공유하고자 합니다.


활용 방안

예를 들어 특정 문서를 읽어 들여 각각의 page 개체를 반환해야 해야하는 기능이 있다고 합시다.

이 때 추가로 문서의 정보 (예, 페이지수) 등을 파악하고 싶습니다.


각각의 페이지를 반환하거나 특정 페이지를 반환하기 위해서는 문서에 접근하여 내용을 읽어들이는 행위를 해야 합니다.

이 때 발생하는 비용은 적지 않으므로 가급적 한 번 내용을 읽었을 때, 다양한 형태의 정보를 수집하는 것이 유리하겠지요,


문서의 정보를 수집하는 행위가 page를 반환하는 기능에 부수적으로 동반된다고 하면 최초 접근하여 문서의 메타데이터를 수집하고 이 후 각각의 페이지를 반환한다고 합시다.


이 경우 메서드가 있으면 좋을 듯 합니다.


그러나 위의 사양으로는 compile 되지 않습니다.

그래서 다음과 같은 꼼수(!)가 필요합니다.

이는 위에 위치한 GetPages 메서드가 yield return을 포함하지 않기 때문에 가능합니다. ;)


References

https://msdn.microsoft.com/ko-kr/library/9k7k7cf0.aspx

http://stackoverflow.com/questions/999020/why-iterator-methods-cant-take-either-ref-or-out-parameters