Результат: ученик прослеживает присваивание и передачу значимых и ссылочных значений, различает переменную, ссылку и объект и проектирует явный контракт мутации, копирования и допустимости псевдонимов.

Содержание:

  1. Различить две семантики присваивания

    • значимый тип хранит само значение;
    • ссылочный тип хранит ссылку на объект;
    • копирование данных значимого типа;
    • копирование ссылки на тот же объект;
    • последующее независимое изменение или совместно наблюдаемая мутация.
  2. Разделить переменную, ссылку и объект

    • имя переменной;
    • ссылка как значение ссылочного типа;
    • объект массива в управляемой памяти;
    • несколько переменных, обозначающих один объект;
    • переменная без ссылки через null;
    • объект без доступного имени, но ещё достижимый через другую ссылку.
  3. Различить идентичность и равенство содержимого

    • ReferenceEquals;
    • == для массивов как сравнение ссылок;
    • ручное поэлементное равенство;
    • два разных объекта с одинаковыми элементами;
    • два имени одного объекта;
    • необходимость заранее назвать проверяемое отношение.
  4. Отделить мутацию объекта от замены ссылки

    • изменение элемента массива;
    • присваивание переменной нового массива;
    • сохранение старого объекта у других псевдонимов;
    • локальная замена параметра;
    • замена переменной вызывающего кода через ref.
  5. Проследить передачу массива по значению

    • копия ссылки в параметре;
    • доступ к общему объекту;
    • изменение элементов через параметр;
    • невлияние локального переприсваивания параметра на аргумент;
    • различие контракта «изменяет объект» и «заменяет ссылку».
  6. Использовать ref, out и in со ссылками

    • ref для перенаправления переменной вызывающего кода;
    • out для создания выходной ссылки;
    • in как запрет переприсваивания параметра;
    • сохранение возможности изменить достижимый массив через in;
    • явное описание глубины неизменяемости.
  7. Работать с возможным null

    • тип T[]?;
    • проверка до разыменования;
    • условный доступ ?. и условный индексатор ?[];
    • ?? и согласованное значение по умолчанию;
    • null-forgiving operator ! только как утверждение программиста, а не проверка;
    • сохранение nullable-предупреждений как диагностического сигнала.
  8. Проектировать глубину копии

    • копия внешней ссылки;
    • полная независимая копия массива;
    • частичная копия диапазона;
    • поверхностная копия составной структуры ссылок;
    • глубокая копия всех требуемых объектов;
    • копирование при записи;
    • явное указание объектов, которые допускается разделять.
  9. Учитывать перекрывающиеся области

    • копирование внутри одного массива;
    • направление обхода;
    • потеря ещё не скопированного значения;
    • источник и назначение как одна или разные области;
    • инвариант безопасного переноса.
  10. Проектировать транзакционную мутацию

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

    • объект достижим через цепочку ссылок;
    • удаление одной ссылки не уничтожает общий объект;
    • потеря последней достижимой ссылки;
    • автоматическое освобождение как недетерминированная работа среды;
    • отсутствие ручного управления временем освобождения в данном курсе.