Основное различие между Foreach и использованием
Вопрос
На этот простой вопрос может ответить даже школьник.
В чем сходство и различия между "ForEach" и "Using" (задано в интервью).
Мое предположение было таким
1) Оба они поддаются перечислению
2) Using может обрабатывать ресурсы памяти, но foreach не может.using поддерживает IDisposable,foreach не может.
Я хочу знать ответы.
Решение
Сходства:
- они оба являются логическими расширениями кода, предоставляющими базовый код для сложных сценариев
- оба варианта включают скрытую переменную, введенную компилятором:для итератора и моментального снимка одноразового объекта, соответственно
Но примерно на этом все и заканчивается...
using
требованияIDisposable
;foreach
мог бы триггер изIEnumerable[<T>]
, но на самом деле это типизированная утка (вам не нужноIEnumerable
дляforeach
)using
обладает предсказуемымtry
/finally
сконструировать;foreach
мог бы вовлекать в себяDispose()
если итератор являетсяIEnumerable<T>
Во всяком случае, я бы сказал using
находится ближе к lock
чем для foreach
.
Другие советы
foreach
избавится от вашего IEnumerable
, если он реализует IDisposable
. using
определяет область действия, за пределами которой объект или объекты будут расположены. Он не зацикливается и не повторяется.
Они оба служат совершенно разным целям. Р>
foreach
предназначен для перечисления элементов в коллекции / массиве. using
- это удобная конструкция, позволяющая убедиться, что вы правильно распоряжаетесь тем, что используете. Даже когда, например, создаются исключения.
Сходство этих двух конструкций просто странное. Кто-нибудь может подумать о каких-либо сходствах (кроме очень очевидного: «они оба являются ключевыми словами в C #»)?
Основное различие между foreach
и using
заключается в том, что IEnumerable
используется для перечисления по IDisposable
, тогда как <=> используется для определения области действия, за пределами которой будет удален объект. р>
Между <=> и <=> существует одно сходство: перечислители реализуют <=>, а <=> неявно переносит использование перечислителя в блок <=>. Еще один способ сказать, что <=> можно перекодировать как блок использования, и полученный IL будет идентичным.
Блок кода
var list = new List<int>() {1, 2, 3, 4, 5};
foreach(var i in list) {
Console.WriteLine(i);
}
фактически совпадает с
var list = new List<int>() {1, 2, 3, 4, 5};
using (var enumerator = list.GetEnumerator()) {
while (enumerator.MoveNext()) {
Console.WriteLine(enumerator.Current);
}
}