Подтвердить что ты не робот

Почему вы должны избегать перебора неизменяемых коллекций типов значений с помощью foreach?

В документе стандартов кодирования я нашел это выражение:

Избегайте использования foreach для перебора неизменяемые коллекции типов значений. Например. Строковые массивы.

Почему этого следует избегать?

4b9b3361

Ответ 1

Вы не должны этого избегать. Стандартный документ кодирования, который вы читаете, говорит глупости. Попробуйте найти автора и попросить его объяснить.

Помимо всего прочего, string является ссылочным типом, а массивы всегда изменяемы... это, конечно, меня беспокоит качество остальной части документа. Существуют ли другие подозрительные рекомендации?

(Возможно, что "неизменяемый" предназначался для обозначения типа значения, а не коллекции - тот факт, что он неоднозначен, является еще одним тревожным знаком, ИМО.)

Ответ 2

Я думаю, что причиной этого утверждения является то, что он написан до .NET 2.0.

При использовании foreach в .NET 1.x он использовал интерфейс IEnumerable (поскольку интерфейс IEnumerable<T> еще не существовал). При повторении с помощью коллекции типов значений перечислитель будет помещать каждый элемент в способный вернуть его в качестве ссылки на объект, тогда код foreach должен был распаковать его.

Строковый массив, конечно, не является примером массива типов значений. Целый массив.

Ответ 3

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