2009-08-17 2 views
1

ДубликатWhat is the purpose/advantage of using yield return iterators in C#?разница между итератора и массив в C#

Хорошо это просто не это. Можете ли вы подробно объяснить мне, как это разные?

Как Возвращение массива (Допустим, строка) или делать возврат выход с итератора (также строки)

я нахожу их быть такими же. Пожалуйста, перейдите к деталям.

+0

Это дубликат, есть несколько отличных ответов на это здесь http://stackoverflow.com/questions/1088442/what-is-the-purpose-advantage-of-using-yield-return-iterators-in- c –

+0

Нет, это не так. Я сравниваю с массивом. Но так или иначе :) –

ответ

9

Массив - это указатель на блок данных с фиксированным размером и произвольным доступом. Вызывающий абонент может обновлять значения, получать значения в любом порядке и т. Д.

Итератор является ключом к последовательности значений (которые могут быть бесконечными по длине). Вызывающий абонент может получить доступ только к ним в порядке, указанном источником, и не может их обновить.

Доступ к дополнительным ресурсам зависит от каждого значения в последовательности, но он имеет то преимущество, что ему не нужны все данные одновременно, поэтому он может быть более эффективным для последовательностей в середине и в конце.

+0

Вы всегда отвечаете на мой вопрос по этому вопросу. Благодаря! –

2

Если вы вернете итератор, который не может изменить внутреннюю структуру данных, вам может и не понадобиться копировать его.

С другой стороны, распространенная ошибка заключается в том, чтобы вернуть что-то, что вы используете внутренне, и это позволит внешнему коду изменять внутренние структуры данных, которые обычно являются большими, нет-нет.

Например, рассмотрим следующее:

Int32[] values = otherObj.GetValues(); 
values[0] = 10; 

Если метод GetValues ​​просто возвращает внутренний массив, что вторая строка теперь изменить первое значение этого массива.

1

Итераторы нельзя изменять, но массивы могут. Вы можете ссылаться на определенные элементы в массиве, используя нотацию [index], но с итераторами вы можете перейти только из первого элемента в порядке.

+0

Итак, если вы хотите, чтобы DLL или класс возвращали что-то в программу thrid-party (они используют наши), вы должны использовать итератор? –

+0

Точно! Это или вернуть копию массива. – AgileJon

2

Массив - это хранилище данных. Итератор - это просто итератор над другим хранилищем данных или методом, который создает последовательность.

Таким образом, если метод возвращает массив, вы можете изменить его и его элементы. Вы не можете сделать это через итератор. Кроме того, массив имеет ограниченный размер. Итератор может быть бесконечным.

Смежные вопросы