Není to while
vs foreach
to dělá ten rozdíl. Je to volání .Cast<T>()
.
V prvním vzorku dáváte výnos stejně objekt v každé iteraci cyklu while. Pokud si nedáte pozor, dokončíte iterátor výnosu před skutečným použitím dat a DataReader již bude zlikvidován. To se může stát, pokud byste například zavolali .ToList()
po zavolání této metody. Nejlepší, v co můžete doufat, by bylo, aby každý záznam v seznamu měl stejnou hodnotu.
(Pro tip:většinou nechcete volat .ToList()
dokud nezbytně musíte. Je lepší pracovat pouze s IEnumerable records).
Ve druhém příkladu, když zavoláte .Cast<T>()
na čtečce dat efektivně vytváříte kopii dat při jejich iteraci každým záznamem. Nyní již neposkytujete stejný objekt.