И в vb.net, и в C # конструкция foreach работает, вызывая один раз метод GetEnumerator для объекта и захватывая возвращаемый объект, повторно вызывая MoveNext и Current для объекта, возвращенного из GetEnumerator, и, наконец, если этот объект реализует Dispose, вызывая Избавьтесь от этого. Ни C #, ни vb.net на самом деле не кэшируют перечисляемый объект, но ни одному из них не нужно использовать объект для каких-либо целей после того, как он вызвал GetEnumerator для него один раз. Оба языка держат перечислитель, но ни один из них не предоставляет никаких средств для работы с ним, кроме подразумеваемых вызовов MoveNext, Current и Dispose.
олагая, чтоSomeMethod
имеет подпись
public IEnumerable<T> SomeMethod<T>();
есть ли разница между
foreach (T tmp in SomeMethod<T>()) { ... }
а также
IEnumerable<T> result = SomeMethod<T>();
foreach (T tmp in result) { ... }
Другими словами, будут ли результатыSomeMethod<T>
кэшироваться в первом утверждении или оно будет оцениваться при каждой итерации?