Накратко, не е нужно да се тревожите за това, стига извикващият метода да обработва правилно обектите IEnumerator
.
IEnumerator
внедрява IDisposable
и логиката, използвана при създаването на итераторните блокове, всъщност е достатъчно интелигентна, за да изпълни всички неизпълнени окончателни блокове, когато бъде изхвърлена. Блокът finally се създава в резултат на извикването using
и там се изхвърля ресурсът IDisposable
.
Така че докато IEnumerator
обектите, създадени от този IEnumerable
, са или итерирани напълно (в който случай последното MoveNext
извикване ще достигне края на блока using
и ще изхвърли ресурса), или изхвърлени, IDisposable
клиентът ще бъде изхвърлен.
Обърнете внимание, че ако се притеснявате, че потребителят на вашия код може да не третира правилно обектите IEnumerator
, тогава най-добре е да не използвате итераторен блок с мързелива оценка. Ако искате да сте сигурни, че дори и обаждащият се да не „играе добре“, тогава внимателно оценете метода (т.е. вземете кода, който имате, изхвърлете резултатите в списък и след това върнете този списък). Ако последствията от неизхвърлянето на ресурса са предимно или изцяло свързани с производителността (неосвобождаване на памет за известно време, поддържане на отворена връзка и т.н.), тогава това може да не е проблем, но ако задържането на ключалката завинаги е основен проблем (т.е. заключен ресурс, който може да доведе до блокиране, ако не бъде освободен), тогава предимството на мързелива оценка може да не си струва.
person
Servy
schedule
22.11.2012
using
и никой не го нарича лош, но никой не обяснява, че е добре (или защо е добре), доколкото мога да кажа. - person Servy   schedule 22.11.2012IEnumerable<IEnumerable<string>>
. Предполагам, че не това имахте предвид. - person svick   schedule 22.11.2012yield
Влизане отusing
е лоша идея, тъй като викащите, които неDispose()
преброителят ще ви объркат. - person SLaks   schedule 22.11.2012