Ваш вопрос слишком сложный. Разбей это.
Создает ли использование последовательности foreach для итерации последовательности типов значений копию последовательности?
номер
Создает ли копия foreach при использовании «foreach» для итерации последовательности типов значений?
Да.
Создает ли копия «каждое» с помощью for для эквивалентной итерации индексированной последовательности типов значений?
Обычно да. Есть вещи, которые вы можете сделать, чтобы избежать копирования, если вы знаете особые вещи о коллекции, например, что это массив. Но в общем случае индексированных коллекций при индексировании последовательности возвращается копия значения в последовательности, а не ссылка на место хранения, содержащее значение .
Делает ли что-либо с типом значения, копия значения?
Просто о. Типы значений копируются по значению . Вот почему они называются типами значений. Единственные вещи, которые вы делаете с типами значений, которые не копируют, - это вызовы методов для типа значения и передача переменной типа значения с помощью «out» или «ref». Типы значений копируются постоянно ; именно поэтому типы значений часто медленнее, чем ссылочные типы.
Копирует ли ссылка использование foreach или for для итерации последовательности ссылочного типа?
Да. Значением выражения ссылочного типа является ссылка. Эта ссылка копируется всякий раз, когда она используется.
Так в чем же разница между типами значений и ссылочными типами с точки зрения их поведения при копировании?
Типы значений копируются по значению. Типы ссылок копируют ссылку, но не указанную вещь. 16-байтовый тип значения копирует 16 байтов каждый раз, когда вы его используете. Тип ссылки 16 байтов копирует ссылку 4 (или 8) байтов каждый раз, когда вы используете ее.
Является ли цикл foreach медленнее, чем цикл for?
Часто это так. Цикл foreach часто выполняет больше работы, поскольку он создает перечислитель и вызывает методы перечислителя, а не просто увеличивает целое число. Целочисленные приращения чрезвычайно быстры. Также не забывайте, что перечислитель в цикле foreach должен быть расположен, и это также может занять время.
Стоит ли использовать цикл for вместо цикла foreach, поскольку цикл for иногда выполняется на несколько микросекунд быстрее?
Нет. Это глупо. Вы должны принимать продуманные инженерные решения на основе ориентированных на клиента эмпирических данных. Дополнительное бремя цикла foreach крошечно. Клиент, вероятно, никогда не заметит. Что вы должны сделать, это:
- Установить цели производительности на основе отзывов клиентов
- Измерьте, чтобы увидеть, достигли ли вы своих целей
- Если нет, найдите самую медленную вещь, используя профилировщик
- Исправьте это
- Повторяйте, пока не достигнете своих целей
Шансы чрезвычайно хороши: если у вас проблемы с производительностью, изменение цикла foreach на цикл for не будет иметь никакого значения для вашей проблемы. Сначала напишите код так, чтобы он выглядел ясным и понятным.