Создание консольного To‑do приложения на C#

Изучение C# через создание To‑do приложения — полезное упражнение для начинающих. С помощью этого приложения пользователь может добавлять задачи, просматривать список задач и удалять элементы. Приложение охватывает ключевые основы программирования: ввод пользователя, хранение данных в коллекциях, условные операторы и циклы.
Ниже приведён подробный набор шагов для создания простого консольного приложения в Visual Studio. В конце — дополнительные рекомендации, сценарии тестирования, шаблоны и идеи для развития проекта.
Почему стоит учить C# на простых проектах
Коротко о причинах выбрать C# для учебного проекта:
- C# — язык с сильной типизацией и ясным синтаксисом, удобен для изучения принципов ООП и структур данных.
- Платформа .NET даёт богатую стандартную библиотеку и инструменты (Visual Studio), что ускоряет разработку.
- Консольные приложения позволяют сосредоточиться на логике без фронтенд‑слоя.
Краткое определение: enum — перечисление именованных констант, в нашем случае — список действий пользователя.
Как создать новое консольное приложение
Полный исходный код этого проекта можно разместить на GitHub для хранения и версий.
- Откройте приложение Visual Studio на компьютере.
- Нажмите на «Create a new project».
- Выберите тип проекта «C# Console Application» и нажмите «Next».
- Укажите имя проекта и папку для решения.
- Оставьте значение Target Framework по умолчанию и нажмите «Create».
После создания проекта Visual Studio сгенерирует простой “Hello World”. Его нужно заменить на код логики To‑do списка.
Основная логика: добавление задачи
В консольном приложении можно использовать вывод (Console.Write/WriteLine) для запроса данных у пользователя и Console.ReadLine для получения ввода.
- В начале файла подключите пространство имён, позволяющее работать со списками:
using System.Collections.Generic;- Внутри метода Main() удалите код Hello World и объявите новый список для хранения задач:
List toDoList = new List(); - Создайте цикл, который будет выполняться, пока пользователь не завершит программу:
while (true) {
}- Сверху файла добавьте enum со списком возможных действий пользователя:
enum UserChoice {
AddTask = 1,
Exit
}- Внутри цикла выводите список возможных действий и считывайте выбор пользователя (он вводит цифру):
Console.WriteLine("1. Add task");
Console.WriteLine("2. Exit");
int choice = int.Parse(Console.ReadLine());- Если пользователь выбирает “1”, запросите имя задачи и добавьте его в список:
if (choice == (int)UserChoice.AddTask) {
Console.Write("Enter task: ");
string task = Console.ReadLine();
toDoList.Add(task);
Console.Clear();
Console.WriteLine("Task added successfully!");
}- Если пользователь выбирает выход, прервите цикл:
else if (choice == (int)UserChoice.Exit) {
break;
}- Запустите приложение через зелёную кнопку «Play» в Visual Studio.
- Введите “1” и добавьте задачу.
Обработка неверного ввода
Вместо int.Parse рекомендуется использовать int.TryParse, чтобы избежать исключений при вводе нечисловых значений. Это небольшое улучшение значительно повышает устойчивость программы.
Как отображать задачи в списке
Перед тем как предложить пользователю добавить задачу, полезно показывать текущие элементы списка.
- Внутри цикла Main() добавьте условие, проверяющее, не пуст ли список:
while (true) {
if (toDoList.Count > 0) {
}
Console.WriteLine("1. Add task");
Console.WriteLine("2. Exit");
}- Если список содержит элементы, пробегитесь по нему и выведите каждый элемент в виде маркированного списка:
if (toDoList.Count > 0) {
Console.WriteLine("To-do List:");
for (int i = 0; i < toDoList.Count; i++) {
Console.WriteLine("- " + toDoList[i]);
}
Console.WriteLine("");
}- Если список пуст, покажите соответствующее сообщение:
else {
Console.WriteLine("You currently have no tasks in your To-do list.");
Console.WriteLine("");
}- Запустите приложение и добавьте элементы — консоль будет обновлять список.
Совет: логика вывода и логика ввода/меню должны быть краткими методами, чтобы Main() оставался читаемым. В небольшом проекте можно выносить в отдельные функции: ShowList(), ShowMenu(), HandleInput().
Как удалять задачи из списка
При удалении задачи снова покажите список и попросите ввести номер удаляемого элемента.
- Обновите enum, добавив действие удаления:
enum UserChoice {
AddTask = 1,
DeleteTask,
Exit
}- Обновите меню действий:
Console.WriteLine("1. Add task");
Console.WriteLine("2. Delete task");
Console.WriteLine("3. Exit");- Добавьте ветку обработки выбора удаления:
else if (choice == (int)UserChoice.DeleteTask) {
}- Если список не пуст, выведите элементы с номерами, чтобы пользователь мог выбрать нужный:
if (toDoList.Count > 0) {
Console.WriteLine("Enter the number of the task you want to delete:");
for (int i = 0; i < toDoList.Count; i++) {
Console.WriteLine("(" + (i + 1) + ") " + toDoList[i]);
}
}- Считайте ввод пользователя, преобразуйте в индекс и удалите элемент с помощью RemoveAt():
int taskNum = int.Parse(Console.ReadLine());
taskNum--;
if (taskNum >= 0 && taskNum < toDoList.Count) {
toDoList.RemoveAt(taskNum);
Console.Clear();
Console.WriteLine("Task deleted successfully!");
Console.WriteLine("");
}- Добавьте проверку на неверный номер задачи:
else {
Console.Clear();
Console.WriteLine("Invalid task number.");
Console.WriteLine("");
}- Запустите и проверьте добавление и удаление задач.
Полный пример кода (развязка)
Ниже приведён компактный, но практичный пример полного консольного приложения To‑do. Он включает базовую валидацию ввода и обработку трёх действий.
using System;
using System.Collections.Generic;
enum UserChoice { AddTask = 1, DeleteTask, Exit }
class Program {
static void Main() {
List toDoList = new List();
while (true) {
if (toDoList.Count > 0) {
Console.WriteLine("To-do List:");
for (int i = 0; i < toDoList.Count; i++) {
Console.WriteLine("- " + toDoList[i]);
}
Console.WriteLine();
} else {
Console.WriteLine("You currently have no tasks in your To-do list.");
Console.WriteLine();
}
Console.WriteLine("1. Add task");
Console.WriteLine("2. Delete task");
Console.WriteLine("3. Exit");
if (!int.TryParse(Console.ReadLine(), out int choice)) {
Console.Clear();
Console.WriteLine("Invalid input.");
continue;
}
if (choice == (int)UserChoice.AddTask) {
Console.Write("Enter task: ");
string task = Console.ReadLine();
toDoList.Add(task);
Console.Clear();
Console.WriteLine("Task added successfully!");
} else if (choice == (int)UserChoice.DeleteTask) {
if (toDoList.Count > 0) {
Console.WriteLine("Enter the number of the task you want to delete:");
for (int i = 0; i < toDoList.Count; i++) {
Console.WriteLine("(" + (i + 1) + ") " + toDoList[i]);
}
if (!int.TryParse(Console.ReadLine(), out int taskNum)) {
Console.Clear();
Console.WriteLine("Invalid input.");
} else {
taskNum--;
if (taskNum >= 0 && taskNum < toDoList.Count) {
toDoList.RemoveAt(taskNum);
Console.Clear();
Console.WriteLine("Task deleted successfully!");
Console.WriteLine();
} else {
Console.Clear();
Console.WriteLine("Invalid task number.");
Console.WriteLine();
}
}
} else {
Console.Clear();
Console.WriteLine("You currently have no tasks in your To-do list.");
Console.WriteLine();
}
} else if (choice == (int)UserChoice.Exit) {
break;
} else {
Console.Clear();
Console.WriteLine("Unknown choice.");
}
}
}
} Советы по расширению приложения и альтернативы
Хранение данных:
- В памяти (List
) — подходит для учебных целей. - В файл (текстовый или JSON) — сохраняет задачи между запусками.
- В базу данных (SQLite) — удобно для масштабирования.
- В памяти (List
Интерфейс:
- Консоль → быстрый старт.
- Windows Forms / WPF → графический интерфейс для практики UI.
- ASP.NET Core → превратите приложение в веб‑сервис.
Дополнительные функции:
- Метки/приоритеты/дедлайны для задач.
- Фильтры и поиск.
- Экспорт/импорт в CSV или JSON.
Ментальные модели и эвристики
- Keep It Simple: сначала реализуйте минимально рабочий продукт (MVP) — добавление, отображение, удаление.
- Разделение ответственности: UI‑логика не должна быть смешана с логикой работы со списком.
- Fail fast: проверяйте ввод пользователя сразу и давайте понятные сообщения об ошибке.
Критерии приёмки
- Можно добавить задачу: при вводе текст добавляется в список и виден в выводе.
- Можно удалить задачу по номеру: выбранный элемент удаляется и список обновляется.
- Приложение не падает при вводе нечисловых значений: используется валидация ввода.
- Действия меню понятны пользователю и доступны с клавиатуры.
Тесты и сценарии приёмки
- Добавление пустой строки: проверка, будет ли добавлена пустая задача или отклонена.
- Ввод нечислового значения в меню: программа должна выводить сообщение об ошибке и продолжать работу.
- Удаление по недопустимому номеру (0, отрицательное, больше длины списка): должно появляться сообщение “Invalid task number.”.
- Последовательность действий: добавить несколько задач, удалить среднюю, проверить порядок оставшихся.
Чеклист для ролей
Для ученика:
- Написать и запустить приложение.
- Добавить обработку ошибок ввода.
- Реализовать сохранение задач в файл.
Для ревьюера:
- Проверить читаемость кода и разделение логики.
- Убедиться, что есть базовая валидация ввода.
- Протестировать сценарии с граничными значениями.
Примеры альтернатив и когда они уместны
- Если нужно многопользовательское приложение или синхронизация — используйте сервер и базу данных (ASP.NET + PostgreSQL/SQL Server).
- Для простого личного списка на одном компьютере подойдёт файл или SQLite.
- Если цель — изучать UI, переходите на Windows Forms или WPF.
Безопасность и конфиденциальность
В консольном To‑do обычно не хранится чувствительная информация. Тем не менее:
- Не храните пароли или персональные данные в открытом виде.
- При экспорте в файлы сообщайте пользователю о формате и местоположении.
Глоссарий (1 строка)
- List
: динамический массив строк в .NET. - enum: перечисление — набор именованных констант.
- Console.ReadLine/WriteLine: ввод/вывод в консоли.
Заключение
Вы успешно создали простое консольное To‑do приложение на C#. Это хорошая отправная точка: дальше можно добавить сохранение данных, графический интерфейс, фильтры и синхронизацию. Начните с MVP, затем добавляйте функциональность итеративно.
Важно: расширяйте проект маленькими шагами и проверяйте каждый новый кусок функциональности тестами.
Сводка:
- Реализованы базовые операции: добавить, показать, удалить задачу.
- Программа устойчива к нечисловому вводу (в примере используется TryParse).
- Рекомендованы варианты сохранения и развития проекта.