Основное различие между Foreach и использованием

StackOverflow https://stackoverflow.com/questions/1607871

  •  05-07-2019
  •  | 
  •  

Вопрос

На этот простой вопрос может ответить даже школьник.

В чем сходство и различия между "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);
        }
    }
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top