И в 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> кэшироваться в первом утверждении или оно будет оцениваться при каждой итерации?

Ответы на вопрос(2)

Ваш ответ на вопрос