Тези два въпроса почти отговарят на моя въпрос, но не съвсем. Считайте това за последващ въпрос към тези.
- Трябва ли да обмисля изхвърлянето на всеки IEnumerable‹ T› Използвам?
- Разбиране на итераторните блокове и метода за изхвърляне
Разбирам, че foreach
цикъл ще Dispose
на изброител, когато приключи с него.
Въпросът ми е следният:
Ако въпросният изброител всъщност е c# итераторен блок (т.е. GetEnumerator()/yield
) от IEnumerable<T>
клас, който сам по себе си имплементира IDisposable
, мога ли да бъда сигурен, че самият обект ще бъде изхвърлен? Или трябва да прибягна до извикване на GetEnumerator()/MoveNext()/Current
изрично в блок using
?
РЕДАКТИРАНЕ: Този фрагмент демонстрира отговора на @JonSkeet.
РЕДАКТИРАНЕ #2: Този фрагмент, базиран на коментарите на @JonSkeet, демонстрира идеална употреба. Итераторният блок е отговорен за живота на необходимите ресурси, а не за самия изброим обект. По този начин, enumerable може да бъде изброен многократно, ако е необходимо - всеки enumerable има свой собствен ресурс, с който да работи.
foreach
надIEnumerator<T> where T : IEnumerable<U>, IDisposable
ще изхвърли обектите от типU
? Разбира се, че не, защо би го направил? Ако изброя колекция от отворени сокети, трябва ли сокетите да се затварят автоматично? - person Jon   schedule 05.03.2014IDisposable
и няма методDispose
, така че не може да бъде изхвърлен.IEnumerator<T>
разширяваIDisposable
, а неIEnumerable<T>
. - person Servy   schedule 05.03.2014IDisposable
, аforeach
няма да го изхвърли. - person Servy   schedule 05.03.2014