Простые приложения на C#
Простые приложения на C#
Язык программирования C# сочетает в себе мощь объектно-ориентированного подхода, строгую типизацию и высокую производительность. Консольные приложения на этом языке служат идеальной основой для понимания фундаментальных концепций — работы с памятью, управления потоками выполнения, обработки исключений и взаимодействия с операционной системой. Ниже представлены примеры реализации типовых утилит, демонстрирующих ключевые возможности платформы .NET.
Как запускать примеры из главы
- dotnet CLI:
dotnet new console -n Demo
Program.cs
dotnet run
- Один файл:
csc Program.cs && Program.exe(Windows) илиmono Program.exe. - Нужно: .NET SDK 8+ (
dotnet --version).
dotnet --version
Генератор случайных паролей
Генерация надежных паролей требует комбинации различных символов из заданных наборов. В C# для этого используют класс Random или более современный System.RandomNumberGenerator. Работа со строками осуществляется через методы преобразования массивов символов в строки.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Код создает массив байтов фиксированного размера. Метод GetBytes заполняет этот массив криптографически стойкими случайными значениями. Цикл перебирает каждый байт, вычисляет остаток от деления на длину набора допустимых символов и выбирает соответствующий символ. Результат собирается в строку и выводится в консоль. Использование RandomNumberGenerator предпочтительнее обычного Random, так как он обеспечивает непредсказуемость значений, необходимую для безопасности.
Сортировщик текстового файла
Работа с файловой системой включает чтение содержимого, обработку данных в памяти и запись результата обратно. Классы File и StreamReader/StreamWriter предоставляют удобный интерфейс для этих операций. Список строк сортируется методом Sort, который использует алгоритм быстрой сортировки.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Метод ReadAllLines загружает все строки файла в список. Лямбда-выражение внутри метода Sort определяет правило сравнения: строки сравниваются без учета регистра. После сортировки метод WriteAllLines записывает обновленный список в новый файл. Обработка ошибок проверяет существование входного файла перед началом работы.
Консольный калькулятор
Арифметические операции реализуются через условные конструкции. Парсинг пользовательского ввода требует разделения строки на компоненты. Обработка исключений защищает программу от некорректных данных.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Программа последовательно запрашивает данные у пользователя. Метод TryParse пытается преобразовать введенную строку в число типа double. Если преобразование не удается, программа сообщает об ошибке и завершается. Операция выбирается через конструкцию switch. При делении выполняется проверка делителя на ноль. Результат выводится только если операция выполнена корректно.
Трекер задач в формате JSON
Сертификация и десериализация объектов позволяют хранить сложные структуры данных в текстовом виде. Библиотека System.Text.Json является стандартным инструментом для работы с JSON в современных версиях .NET.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Класс TaskItem описывает структуру одной записи. Метод LoadTasks читает файл и преобразует JSON-строку в список объектов. Если файл отсутствует, возвращается пустой список. Метод SaveTasks выполняет обратное действие: объект сериализуется в JSON и записывается в файл. Цикл while позволяет пользователю добавлять задачи до тех пор, пока не будет введена команда выхода.
Простой HTTP-сервер и клиент
Класс HttpListener позволяет создавать сервера, принимающие запросы. Класс HttpClient используется для отправки запросов к этим серверам. Это базовый пример сетевой коммуникации без использования сторонних фреймворков.
Пример кода Сервера
Код ITЗагрузка примера кода…
Пример кода Клиента
Код ITЗагрузка примера кода…
Разбор логики
Сервер создает экземпляр HttpListener, регистрирует адрес и запускает цикл ожидания запросов. Получив контекст, сервер формирует ответ, конвертирует текст в байты и записывает его в поток вывода. Клиент создает HttpClient, отправляет GET-запрос и ожидает ответ. Метод EnsureSuccessStatusCode выбрасывает исключение при ошибках HTTP (например, 404 или 500). Асинхронные методы await предотвращают блокировку потока во время сетевого ожидания.
Утилита для сканирования директорий
Рекурсивный обход файловых структур реализуется через метод Directory.GetFiles с указанием параметра поиска поддиректорий. Информация о каждом файле доступна через свойства класса FileInfo.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Метод GetFiles принимает корневой путь, маску поиска (*) и опцию AllDirectories, которая включает подпапки в поиск. Цикл проходит по каждому файлу, создает объект FileInfo для получения метаданных (размер, имя) и суммирует общий объем. Проверка индекса массива ограничивает вывод на экран для демонстрации.
Скрипт создания резервной копии
Копирование файлов требует проверки существования источника и целевой папки. Метод File.Copy позволяет дублировать файлы, а Directory.CreateDirectory создает отсутствующие каталоги.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Программа получает имена исходной и целевой папок. Текущая дата и время используются для формирования уникального имени папки резервной копии. Создается структура папок, повторяющая исходную. Цикл копирует каждый файл, сохраняя относительный путь. Флаг true в методе Copy разрешает перезапись файлов с таким же именем, если они уже существуют.
Мониторинг дискового пространства
Класс DriveInfo предоставляет информацию о физических и логических дисках системы. Вычисления процентов свободного места выполняются путем деления доступного объема на общий.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Метод GetDrives возвращает массив всех подключенных томов. Цикл фильтрует диски по типу (фиксированные и сетевые), игнорируя приводы CD/DVD. Объемы переводятся из байт в гигабайты. Процент занятого места рассчитывается как разница между общим и свободным объемом, деленная на общий объем. Вывод форматируется с использованием спецификаторов ширины поля.
Парсер URL и проверка доступности ресурса
Разбор ссылок осуществляется через класс Uri. Проверка доступности требует создания HTTP-запроса и анализа кода состояния ответа.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Массив ссылок содержит тестовые адреса. Цикл создает объект Uri для каждого элемента, извлекая хост, порт и схему. Настройка таймаута предотвращает зависание программы при отсутствии ответа от удаленного сервера. Метод GetAsync отправляет запрос, а свойство IsSuccessStatusCode указывает на успешность операции (код 2xx). Исключения перехватываются для обработки сетевых ошибок.
Конвертер форматов дат
Класс DateTime поддерживает различные форматы представления времени. Метод ToString преобразует дату в строку по заданному шаблону, а ParseExact выполняет обратное действие, проверяя соответствие строки шаблону.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Входная строка соответствует ISO 8601. Метод ParseExact строго проверяет соответствие шаблона yyyy-MM-ddTHH:mm:ss. Если формат не совпадает, выбрасывается исключение. Результат преобразуется в формат dd.MM.yyyy HH:mm с помощью метода ToString. Свойство Kind показывает локальное или универсальное время.
Утилита для просмотра запущенных процессов
Класс Process из пространства имен System.Diagnostics позволяет взаимодействовать с процессами операционной системы. Можно получить список всех активных процессов, их идентификаторы и названия.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Метод GetProcesses возвращает массив всех процессов, запущенных текущим пользователем. Цикл проходит по списку, пытаясь прочитать свойства ProcessName, Id и TotalProcessorTime. Обработка исключений необходима, так как процессы могут завершиться в момент чтения или требовать повышенных привилегий. Ограничение количества выводимых строк делает вывод удобным для восприятия в консоли.
Характерный пример для языка C#
Особенностью C# является использование событий и делегатов для реализации реактивного поведения. Приведенный пример демонстрирует создание простого механизма подписки на события, что характерно для архитектуры приложений на базе .NET.
Как запустить
- Проект:
dotnet new console
Program.cs
dotnet run
- Результат: вывод в консоль (см.
Console.WriteLineв примере).
Пример кода
Код ITЗагрузка примера кода…
Разбор логики
Делегат MessageHandler определяет сигнатуру метода, который может обрабатывать событие. Событие OnMessageReceived объявляется в классе EventPublisher. Метод Broadcast вызывает обработчики, используя оператор ?.Invoke, что безопасно даже при отсутствии подписчиков. Классы Subscriber реализуют метод обработки. В методе Main происходит регистрация обработчиков через оператор += и удаление через -=. Это паттерн наблюдателя, широко используемый в UI-фреймворках и системах сообщений.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.