Результат: ученик объединяет связанные данные в собственный значимый тип с открытыми полями, прослеживает покомпонентное копирование и поддерживает предметный инвариант внешними процедурными методами.
Содержание:
-
Объявить учебную структуру
- ключевое слово
struct; - объявление типа вне методов;
- открытые поля;
- создание переменной собственного типа;
- ограничение курса: без пользовательских конструкторов, свойств и экземплярных методов.
- ключевое слово
-
Создавать значения структуры
default;new T();- инициализатор полей;
- значения по умолчанию всех полей;
- различие допустимого машинного состояния и допустимого предметного состояния.
-
Проследить покомпонентное копирование
- присваивание структуры;
- независимое копирование значимых полей;
- вложенная структура;
- массив структур;
- возврат структуры из метода;
- параметр структуры по значению.
-
Учитывать ссылочные поля
- копирование ссылки внутри структуры;
- две структуры, разделяющие строку или массив;
- поверхностная копия;
- глубокая копия достижимого изменяемого объекта;
- nullable-контракт ссылочного поля;
- отличие копии структуры от независимости всей достижимой графовой структуры.
-
Выбирать способ передачи
- значение;
refдля изменения исходной структуры;outдля создания результата;inдля чтения без переприсваивания параметра;- совпадение мест хранения у двух
ref-аргументов; - явный контракт мутации.
-
Работать с элементом массива структур
- значение элемента по умолчанию;
- чтение элемента в локальную копию;
- изменение локальной копии без записи обратно;
- изменение полей через индекс массива;
- переменная
foreachкак копия; - сортировка и перестановка полных значений.
-
Поддерживать предметный инвариант
- внешний статический метод проверки;
- каноническое представление;
- отказ от частично допустимого результата;
defaultкак допустимое либо отдельно распознаваемое состояние;- проверка до и после операции;
- пример дроби, интервала, вектора или преобразования.
-
Использовать nullable-структуру
T?для отсутствующего пользовательского значения;- проверка наличия;
- различие
nullиdefault(T); - поиск с nullable-результатом;
- альтернатива через
Try...иout.
-
Выбирать между формами связанных данных
- отдельные переменные;
- параллельные массивы;
- именованный кортеж;
struct;- число допустимых и недопустимых состояний;
- читаемость сигнатур и сохранение связи полей.
-
Строить процедурный API для структуры
- создание и нормализация;
- арифметическая либо геометрическая операция;
- сравнение;
- поиск и фильтрация;
- устойчивая сортировка по нескольким полям;
- разреженные модели как массивы структур.
-
Определять равенство явно
- идентичность ссылочных полей;
- поверхностное равенство полей;
- содержательное равенство достижимых массивов;
- отсутствие автоматически доступного
==для пользовательской структуры без перегрузки; - ручной метод равенства по выбранному контракту.

