Выбор ответа Senior Типы значений и ссылочные обновлено

Защитная копия у readonly-поля структуры

Вопрос

Счётчик Counter это изменяемая структура с методом Inc(), который делает Value++. Что выведет код?

struct Counter { public int Value; public void Inc() => Value++; }

class Holder
{
    private readonly Counter _c;
    public void Run() { _c.Inc(); _c.Inc(); Console.WriteLine(_c.Value); }
}

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: 0. Поле readonly, а структура не readonly, и компилятор не знает, меняет ли Inc состояние.

Варианты ответа

  1. 0правильный ответ
  2. 1
  3. 2
  4. Ошибка компиляции: нельзя вызывать методы у readonly-поля

Разбор

Поле readonly, а структура не readonly, и компилятор не знает, меняет ли Inc состояние. Чтобы не нарушить неизменяемость поля, он вызывает метод на защитной копии (defensive copy). Оба Inc увеличивают копии, поле остаётся 0. Ошибки компиляции нет, это молчаливая ловушка. Лечится readonly struct (тогда изменение Value внутри Inc не скомпилируется) или отказом от изменяемых структур.

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

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

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