Основное различие между Foreach и использованием - PullRequest
2 голосов
/ 22 октября 2009

Это может быть даже простой вопрос, на который может ответить даже школьник.

В чем сходство и различие между «ForEach» и «Использование» (спросили в интервью).

Мое предположение было

1) Оба перечислимы

2) Использование может обрабатывать ресурсы памяти, но foreach не может. Using поддерживает IDisposable, foreach не может.

Я хочу знать ответы.

Ответы [ 5 ]

8 голосов
/ 22 октября 2009
  1. Неа
  2. Нет, foreach избавится от вашего IEnumerable, если он реализует IDisposable.
4 голосов
/ 22 октября 2009

Они оба служат совершенно разным целям.

foreach предназначен для перечисления элементов в коллекции / массиве. using - это удобная конструкция, позволяющая убедиться, что вы правильно распоряжаетесь вещами, которые используете. Например, даже если создаются исключения.

Сходство этих двух конструкций просто странное. Кто-нибудь может подумать о каких-либо сходствах (кроме очень очевидного: «они оба являются ключевыми словами в C #»)?

4 голосов
/ 22 октября 2009

using определяет область действия, за пределами которой объект или объекты будут расположены. Он не зацикливается и не повторяется.

3 голосов
/ 22 октября 2009

Сходства:

  • они оба являются расширениями логического кода, предоставляя стандартный код других сложных сценариев
  • оба включают скрытую переменную, введенную компилятором: для итератора и снимка одноразового объекта соответственно

Но на этом все и заканчивается ...

  • using требования IDisposable; foreach может сработать с IEnumerable[<T>], но на самом деле это утка (вам не нужно IEnumerable для foreach)
  • using имеет предсказуемую конструкцию try / finally; foreach может включать Dispose(), если итератор IEnumerable<T>

Во всяком случае, я бы сказал, что using ближе к lock, чем к foreach.

3 голосов
/ 22 октября 2009

Основное различие между foreach и using состоит в том, что foreach используется для перечисления по IEnumerable, тогда как using используется для определения области действия, за пределами которой будет располагаться объект.

Существует одно сходство между foreach и using: перечислители реализуют IDisposable, и foreach неявно обернет использование перечислителя в блоке using. Другой способ сказать, что это то, что foreach может быть перекодирован как блок использования, и результирующий 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...