Что выведет код Middle Типы значений и ссылочные обновлено

Изменение структуры в списке и массиве

Вопрос

Что выведет программа (.NET 8)? По строке на каждый вывод.

var arr = new S[] { new S { X = 1 } };
arr[0].X = 10;
Console.WriteLine(arr[0].X);

var list = new List<S> { new S { X = 1 } };
var item = list[0];
item.X = 10;
Console.WriteLine(list[0].X);

struct S { public int X; }

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 10, 1. Индексатор массива возвращает ссылку на элемент, поэтому arr[0].X = 10 меняет сам элемент: 10.

Что выведет

10
1

Разбор

Индексатор массива возвращает ссылку на элемент, поэтому arr[0].X = 10 меняет сам элемент: 10. Индексатор List<T> возвращает копию, и item это отдельная структура: в списке остаётся 1. Прямая запись list[0].X = 10 вообще не скомпилируется (ошибка CS1612).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме