Набор практических заданий для отработки двух ключевых тем языка C#.
- 🔢 Перегрузка индексаторов (разные типы параметров, несколько параметров, проверка границ)
- ⚖️ Перегрузка операторов отношений (<, >, <=, >=) и равенства (==, !=)
- ✅ Операторы true/false — участие объектов в условных выражениях
- 📚 Изучите задачи ниже (обязательные и дополнительные отмечены отдельно).
- 💻 Откройте решение
SecondKT.slnв Rider/VS и перейдите в проектApp. - ✍️ Реализуйте недостающий код в файлах с заданиями. Места для реализации снабжены комментариями. Броски
NotImplementedExceptionоставлены намеренно. - 🧪 Запустите проект
App.Tests. Изначально все тесты падают — цель сделать «зелёными» тесты по решённым задачам.
💡 Подсказка: Задачи со звёздочкой (*) — повышенной сложности и НЕ являются обязательными.
/App
/Topics
/Indexers
/T1_1_IntList
/T1_2_KeyValueStore
/T1_3_Matrix2D
/Operators
/T2_1_Money
/T2_2_VersionLite
/App.Tests
# Зеркальная структура с тестами на каждую задачу
/src
# Материалы/презентации
Индексатор — это специальное свойство, позволяющее обращаться к объекту как к массиву. Важно уметь перегружать индексаторы по типам и числу параметров, а также корректно обрабатывать выход за границы.
T1.1_IntList — базовый одномерный индексатор (int index)
- Реализуйте динамический список целых чисел:
this[int index]сget/setи проверкой границ.- Поведение
set:- если
index == Count— добавление в конец; - если
0 <= index < Count— замена значения; - иначе —
ArgumentOutOfRangeException.
- если
- Свойство
Count— текущее число элементов.
- Крайние случаи: отрицательный индекс, чтение из пустого, запись за пределами текущей длины.
T1.2_KeyValueStore — перегрузка индексаторов по типам
- Два индексатора, работающих со связанным хранилищем значений
string:this[int id]this[string key]
get: неизвестный ключ/ид →KeyNotFoundException.set: добавляет/заменяет значение.- Доступ по
nullстроке →ArgumentNullException.
T1.3_Matrix2D — индексатор по двум координатам
- Матрица фиксированного размера с хранением во внутреннем 1D-массиве.
- Индексатор
this[int row, int col]с проверкой границ (row in [0, Rows),col in [0, Cols)). - Отображение
(row, col) -> index = row * Cols + col. - Конструктор валидирует
rows > 0,cols > 0.
Важно обеспечить согласованность равенства и сравнения с Equals/GetHashCode и IComparable<T>. Операторы true/false позволяют использовать объекты в условных выражениях.
T2.1_Money — value object и операторы ==, !=, +, -, ++, --, /, %
- Структура:
string Currency,long Amount(в минимальных единицах). - Валидируйте
Currency(неnull/empty/whitespace). - Реализуйте арифметические операторы:
+и-между двумяMoneyс ОДИНАКОВОЙ валютой (иначе →InvalidOperationException).++и--(возвращают новый экземпляр сAmount ± 1)./и%только с целым делителем:Money / int,Money % int(деление с усечением к нулю; деление/остаток на ноль →DivideByZeroException).
- Равенство: совпадают валюта и сумма. В тестах ожидается нормализация регистра валюты.
T2.2_VersionLite — операторы <, >, <=, >=
- Класс с read-only int свойствами
Major,Minor,Patch. - Реализуйте
IComparable<VersionLite>и операторы сравнения. Сначала сравниваем Major, потом Minor, потом Patch. Например "22.01.56" > "22.01.20" ("{Major}.{Minor}.{Patch}") - Конструктор: значения неотрицательны, иначе
ArgumentOutOfRangeException.
- Через IDE (Test Explorer) или командой:
dotnet test - Сначала большинство тестов будет «красным» — это нормально. Делайте задачи по одной и добивайтесь «зелёных» тестов.
- Тесты со звёздочкой
(*)помечены категорией*и считаются дополнительными.
- Решения должны соответствовать проверкам в тестах, включая обработку краевых случаев.