Actualmente estoy leyendo una colección de elementos de una secuencia. Lo hago de la siguiente manera:rendimiento siempre se llama
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
}
}
}
Digamos que tengo una corriente que contiene dos artículos, y hago lo siguiente:
var textReader = //Load textreader here
var parser = new Parser(textReader);
var result1 = parser.Items.Count();
var result2 = parser.Items.Count();
Ahora result1
es 2, mientras que result2
es uno.
Ahora noté que mi verificación nula es inútil? Parece que cada vez que llamo a esa función, se rinde de todos modos.
¿Puede alguien explicarme por qué es esto? Y cuál sería la mejor solución para esta situación (por favor díganme si lo que estoy haciendo es una porquería completa: P).
yup, se debe producir cada vez, ya que no está asignando variable '_items' en cualquier lugar lo que su siempre nula y cargar elementos se llama cada vez. –
Corrígeme si me equivoco pero no lo estoy asignando aquí '_items = LoadItems()' –