Hiện tại tôi đang đọc một bộ sưu tập các mục từ một luồng. Tôi làm điều này như sau:sản lượng luôn được gọi là
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
}
}
}
Hãy nói rằng tôi có một dòng, trong đó có hai mục, và tôi thực hiện như sau:
var textReader = //Load textreader here
var parser = new Parser(textReader);
var result1 = parser.Items.Count();
var result2 = parser.Items.Count();
Bây giờ result1
là 2, trong khi result2
là một.
Bây giờ tôi nhận thấy rằng kiểm tra vô giá trị của tôi là vô ích? Dường như mỗi lần tôi gọi hàm đó, nó được mang lại.
Ai đó có thể giải thích cho tôi biết tại sao điều này là? Và những gì sẽ là giải pháp tốt nhất cho tình huống này (xin vui lòng cho tôi biết nếu những gì tôi đang làm là hoàn thành crap: P).
yup, cần mang mỗi lần kể từ khi bạn không gán biến '_items' bất cứ nơi nào để nó luôn vô các mục tải được gọi mỗi lần. –
Hãy sửa tôi nếu tôi sai nhưng tôi không gán nó ở đây '_items = LoadItems()' –