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

Содержание:

  1. Объявить учебную структуру

    • ключевое слово struct;
    • объявление типа вне методов;
    • открытые поля;
    • создание переменной собственного типа;
    • ограничение курса: без пользовательских конструкторов, свойств и экземплярных методов.
  2. Создавать значения структуры

    • default;
    • new T();
    • инициализатор полей;
    • значения по умолчанию всех полей;
    • различие допустимого машинного состояния и допустимого предметного состояния.
  3. Проследить покомпонентное копирование

    • присваивание структуры;
    • независимое копирование значимых полей;
    • вложенная структура;
    • массив структур;
    • возврат структуры из метода;
    • параметр структуры по значению.
  4. Учитывать ссылочные поля

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

    • значение;
    • ref для изменения исходной структуры;
    • out для создания результата;
    • in для чтения без переприсваивания параметра;
    • совпадение мест хранения у двух ref-аргументов;
    • явный контракт мутации.
  6. Работать с элементом массива структур

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

    • внешний статический метод проверки;
    • каноническое представление;
    • отказ от частично допустимого результата;
    • default как допустимое либо отдельно распознаваемое состояние;
    • проверка до и после операции;
    • пример дроби, интервала, вектора или преобразования.
  8. Использовать nullable-структуру

    • T? для отсутствующего пользовательского значения;
    • проверка наличия;
    • различие null и default(T);
    • поиск с nullable-результатом;
    • альтернатива через Try... и out.
  9. Выбирать между формами связанных данных

    • отдельные переменные;
    • параллельные массивы;
    • именованный кортеж;
    • struct;
    • число допустимых и недопустимых состояний;
    • читаемость сигнатур и сохранение связи полей.
  10. Строить процедурный API для структуры

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

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