To nie jest while
vs foreach
to robi różnicę. To wywołanie .Cast<T>()
.
W pierwszym przykładzie poddajesz się takim samym obiekt w każdej iteracji pętli while. Jeśli nie zachowasz ostrożności, zakończysz iterator zysku przed faktycznym użyciem danych, a DataReader zostanie już usunięty. Może się to zdarzyć, jeśli na przykład wywołasz .ToList()
po wywołaniu tej metody. Najlepsze, na co możesz mieć nadzieję, to to, że każdy rekord na liście będzie miał taką samą wartość.
(Wskazówka dla profesjonalistów:w większości przypadków nie chcesz dzwonić do .ToList()
dopóki absolutnie nie będziesz musiał. Lepiej po prostu pracować z rekordami IEnumerable).
W drugim przykładzie po wywołaniu .Cast<T>()
na czytniku danych, skutecznie tworzysz kopię danych, gdy przechodzą one przez każdy rekord. Teraz nie dajesz już tego samego obiektu.