현재 스트림에서 항목 모음을 읽습니다.yield가 항상 호출 됨
public class Parser{
private TextReader _reader; //Get set in Constructor
private IEnumerable<Item> _items;
public IEnumerable<Item> Items{
get{
//I >>thought<< this would prevent LoadItems() from being called twice.
return _items ?? (_items = LoadItems());
}
}
public IEnumerable<Item> LoadItems(){
while(_reader.Peek() >= 0){
yield return new Item(_reader.ReadLine()); //Actually it's a little different
}
}
}
하자 내가 두 항목을 포함하는 스트림이 있다고, 나는 다음을 수행하십시오 : 나는 다음과 같은이 작업을 수행 result2
한 동안
var textReader = //Load textreader here
var parser = new Parser(textReader);
var result1 = parser.Items.Count();
var result2 = parser.Items.Count();
지금
result1
, 2입니다.
이제 null 체크가 쓸모 없습니까? 그것은 그 함수를 호출 할 때마다 어쨌든 나온다고 생각됩니다.
이유가 무엇인지 설명 할 수 있습니까? 그리고이 상황에 가장 적합한 해결책은 무엇이겠습니까? (내가하고있는 일이 완전한 쓰레기인지 말해주십시오 : P). LoadItems
이 (yield
사용) 게으른 열거하고 필드에 할당되기 때문에
그래, 그것은 모든 시간을 산출한다 그렇게는 항상 null 및 항목을로드 할 때마다 호출됩니다. –
내가 틀렸다면 나에게 정정 해주세요. 그러나 여기에 그것을 지정하지 않았습니다.'_items = LoadItems()' –