Результат: ученик прослеживает присваивание и передачу значимых и ссылочных значений, различает переменную, ссылку и объект и проектирует явный контракт мутации, копирования и допустимости псевдонимов.
Содержание:
-
Различить две семантики присваивания
- значимый тип хранит само значение;
- ссылочный тип хранит ссылку на объект;
- копирование данных значимого типа;
- копирование ссылки на тот же объект;
- последующее независимое изменение или совместно наблюдаемая мутация.
-
Разделить переменную, ссылку и объект
- имя переменной;
- ссылка как значение ссылочного типа;
- объект массива в управляемой памяти;
- несколько переменных, обозначающих один объект;
- переменная без ссылки через
null; - объект без доступного имени, но ещё достижимый через другую ссылку.
-
Различить идентичность и равенство содержимого
ReferenceEquals;==для массивов как сравнение ссылок;- ручное поэлементное равенство;
- два разных объекта с одинаковыми элементами;
- два имени одного объекта;
- необходимость заранее назвать проверяемое отношение.
-
Отделить мутацию объекта от замены ссылки
- изменение элемента массива;
- присваивание переменной нового массива;
- сохранение старого объекта у других псевдонимов;
- локальная замена параметра;
- замена переменной вызывающего кода через
ref.
-
Проследить передачу массива по значению
- копия ссылки в параметре;
- доступ к общему объекту;
- изменение элементов через параметр;
- невлияние локального переприсваивания параметра на аргумент;
- различие контракта «изменяет объект» и «заменяет ссылку».
-
Использовать
ref,outиinсо ссылкамиrefдля перенаправления переменной вызывающего кода;outдля создания выходной ссылки;inкак запрет переприсваивания параметра;- сохранение возможности изменить достижимый массив через
in; - явное описание глубины неизменяемости.
-
Работать с возможным
null- тип
T[]?; - проверка до разыменования;
- условный доступ
?.и условный индексатор?[]; ??и согласованное значение по умолчанию;- null-forgiving operator
!только как утверждение программиста, а не проверка; - сохранение nullable-предупреждений как диагностического сигнала.
- тип
-
Проектировать глубину копии
- копия внешней ссылки;
- полная независимая копия массива;
- частичная копия диапазона;
- поверхностная копия составной структуры ссылок;
- глубокая копия всех требуемых объектов;
- копирование при записи;
- явное указание объектов, которые допускается разделять.
-
Учитывать перекрывающиеся области
- копирование внутри одного массива;
- направление обхода;
- потеря ещё не скопированного значения;
- источник и назначение как одна или разные области;
- инвариант безопасного переноса.
-
Проектировать транзакционную мутацию
- проверка всех предусловий до изменения;
- временный результат;
- публикация только после полного успеха;
- сохранение исходного массива при отказе;
- различие частичной и согласованной операции.
-
Понять достижимость и автоматическую память
- объект достижим через цепочку ссылок;
- удаление одной ссылки не уничтожает общий объект;
- потеря последней достижимой ссылки;
- автоматическое освобождение как недетерминированная работа среды;
- отсутствие ручного управления временем освобождения в данном курсе.

