
C# сохраняет лидирующие позиции среди языков для разработки приложений под Windows, веб-сервисов и игр на Unity. Практика с реальными проектами позволяет быстрее освоить ключевые возможности языка: работу с LINQ, асинхронные операции через async/await, обработку событий и создание пользовательских интерфейсов на WPF или WinForms.
Рассмотрение конкретных примеров кода помогает понять, как реализуются паттерны проектирования, управление зависимостями и модульное тестирование. Например, демонстрация работы с коллекциями через List<T> и Dictionary<TKey, TValue> на реальных данных позволяет видеть разницу в производительности и удобстве использования.
Проекты, включающие взаимодействие с базами данных через Entity Framework, показывают, как строить слои доступа к данным и оптимизировать запросы. Примеры создания REST API на ASP.NET Core демонстрируют структуру контроллеров, маршрутизацию и обработку ошибок, что важно для построения масштабируемых сервисов.
Игровые мини-проекты на Unity с использованием C# дают возможность изучить событийную модель, корутины и управление сценами. Практическая реализация сетевого взаимодействия через Socket или HttpClient закрепляет понимание клиент-серверной архитектуры в контексте приложений на C#.
Создание консольного калькулятора на C# с базовыми операциями

Используйте тип данных double для поддержки дробных чисел. Организуйте ввод с помощью Console.ReadLine() и преобразуйте строки в числа через double.Parse(), добавив обработку исключений FormatException для некорректного ввода.
Пример кода для ввода двух чисел и выбора операции:
Console.Write("Введите первое число: ");
double num1 = double.Parse(Console.ReadLine());
Console.Write("Введите второе число: ");
double num2 = double.Parse(Console.ReadLine());
Console.Write("Выберите операцию (+, -, *, /): ");
string op = Console.ReadLine();
double result = 0;
switch (op)
{
case "+": result = num1 + num2; break;
case "-": result = num1 - num2; break;
case "*": result = num1 * num2; break;
case "/":
if (num2 != 0) result = num1 / num2;
else Console.WriteLine("Деление на ноль невозможно.");
break;
default: Console.WriteLine("Операция не распознана."); break;
}
Console.WriteLine($"Результат: {result}");
Для улучшения программы добавьте цикл while для повторного использования калькулятора без перезапуска приложения. Можно реализовать отдельный метод Calculate(double a, double b, string op), чтобы отделить логику вычислений от ввода данных.
Рекомендовано обрабатывать деление на ноль и некорректные символы операций. Для расширения функционала можно добавить математические функции, например, возведение в степень или вычисление процентов, используя встроенные методы Math.Pow() и Math.Sqrt().
Разработка простого графического приложения с использованием Windows Forms
Для создания графического приложения на C# используйте Windows Forms. Начните с проекта типа «Windows Forms App (.NET)» в Visual Studio. Основная структура приложения включает форму, элементы управления и обработчики событий.
Пример минимальной формы с кнопкой и текстовым полем:
| Файл | Содержимое |
|---|---|
| Program.cs |
using System;
using System.Windows.Forms;
namespace SimpleWinFormsApp
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
|
| MainForm.cs |
using System;
using System.Windows.Forms;
namespace SimpleWinFormsApp
{
public class MainForm : Form
{
private Button clickButton;
private TextBox inputBox;
pgsqlCopy code public MainForm()
{
this.Text = "Простое приложение";
this.Width = 400;
this.Height = 200;
inputBox = new TextBox();
inputBox.Location = new System.Drawing.Point(50, 50);
inputBox.Width = 200;
this.Controls.Add(inputBox);
clickButton = new Button();
clickButton.Text = "Нажать";
clickButton.Location = new System.Drawing.Point(50, 100);
clickButton.Click += ClickButton_Click;
this.Controls.Add(clickButton);
}
private void ClickButton_Click(object sender, EventArgs e)
{
MessageBox.Show("Вы ввели: " + inputBox.Text);
}
}
}
|
Рекомендации при разработке:
| Действие | Пример |
|---|---|
| Добавление элемента управления | Используйте this.Controls.Add(элемент) в конструкторе формы. |
| Установка размеров и позиции | Properties: Location = new System.Drawing.Point(x, y), Width и Height для ширины и высоты. |
| Обработка событий | Привязка через +=, например: button.Click += Button_Click. |
| Запуск приложения | Application.Run(new MainForm()); в методе Main. |
Этот пример демонстрирует базовую структуру и взаимодействие элементов формы. Дальнейшее расширение может включать меню, списки, чекбоксы и другие стандартные контролы Windows Forms.
Работа с файлами: чтение и запись текстовых данных на C#
В C# работа с файлами реализуется через пространство имен System.IO. Основные классы для текстовых данных – StreamReader, StreamWriter, а также статические методы класса File.
Чтение текстовых файлов
Для чтения содержимого файла можно использовать несколько подходов:
- Построчное чтение с StreamReader:
using (var reader = new StreamReader("example.txt")) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } - Чтение всего файла целиком:
string content = File.ReadAllText("example.txt"); Console.WriteLine(content); - Чтение файла как массива строк:
string[] lines = File.ReadAllLines("example.txt"); foreach (var line in lines) { Console.WriteLine(line); }
Запись текстовых файлов
Для записи текста применяются StreamWriter или методы класса File:
- Запись построчно с StreamWriter:
using (var writer = new StreamWriter("output.txt")) { writer.WriteLine("Первая строка"); writer.WriteLine("Вторая строка"); } - Запись всей строки сразу:
File.WriteAllText("output.txt", "Содержимое файла"); - Запись массива строк:
string[] lines = { "Строка 1", "Строка 2", "Строка 3" }; File.WriteAllLines("output.txt", lines);
Рекомендации по работе с файлами

- Использовать
usingдля автоматического закрытия файлов и освобождения ресурсов. - Проверять существование файла через
File.Exists(path)перед чтением. - Обрабатывать исключения
IOExceptionиUnauthorizedAccessExceptionдля предотвращения сбоев при доступе к файлу. - Для больших файлов предпочтительно построчное чтение, чтобы избежать переполнения памяти.
- При записи большого объема данных использовать буферизацию через
StreamWriterс указанием размера буфера.
Создание приложения для управления списком задач с сохранением данных

Для управления задачами в C# удобно использовать коллекцию List<TaskItem>, где TaskItem – класс с полями Id, Title, Description, IsCompleted. Для сохранения данных между сессиями оптимально использовать JSON-файл, обрабатываемый через System.Text.Json.
Пример класса задачи:
public class TaskItem { public int Id { get; set; } public string Title { get; set; } public string Description { get; set; } public bool IsCompleted { get; set; } }
Для хранения и загрузки списка создаются методы:
public void SaveTasks(List<TaskItem> tasks, string path) { var json = JsonSerializer.Serialize(tasks, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(path, json); }
public List<TaskItem> LoadTasks(string path) { if (!File.Exists(path)) return new List<TaskItem>(); var json = File.ReadAllText(path); return JsonSerializer.Deserialize<List<TaskItem>>(json); }
Для работы с задачами создаются методы добавления, удаления и изменения состояния:
public void AddTask(List<TaskItem> tasks, string title, string description) { int id = tasks.Any() ? tasks.Max(t => t.Id) + 1 : 1; tasks.Add(new TaskItem { Id = id, Title = title, Description = description, IsCompleted = false }); }
public void RemoveTask(List<TaskItem> tasks, int id) { var task = tasks.FirstOrDefault(t => t.Id == id); if (task != null) tasks.Remove(task); }
public void ToggleCompletion(List<TaskItem> tasks, int id) { var task = tasks.FirstOrDefault(t => t.Id == id); if (task != null) task.IsCompleted = !task.IsCompleted; }
Для расширения проекта можно добавить фильтрацию по статусу задач, поиск по заголовкам и приоритеты. Для масштабирования лучше рассмотреть хранение данных в SQLite или LiteDB, что позволит работать с большим объемом задач без снижения производительности.
Использование LINQ для фильтрации и сортировки коллекций

LINQ позволяет выполнять точечные операции с коллекциями, минимизируя количество кода и повышая читаемость. Для фильтрации коллекции применяется метод Where, принимающий лямбда-выражение с условием. Например, чтобы выбрать все числа больше 10 из списка:
var result = numbers.Where(n => n > 10).ToList();
Для сортировки используются методы OrderBy и OrderByDescending. Их можно комбинировать с ThenBy и ThenByDescending для многоуровневой сортировки. Пример сортировки списка объектов по возрасту и имени:
var sorted = people.OrderBy(p => p.Age).ThenBy(p => p.Name).ToList();
LINQ позволяет фильтровать и сортировать одновременно, используя цепочку вызовов. Например, получить пользователей старше 18 лет и отсортировать по имени:
var adultsSorted = users.Where(u => u.Age >= 18).OrderBy(u => u.Name).ToList();
Для коллекций с ключами и значениями удобно использовать ToDictionary после фильтрации и сортировки:
var dict = users.Where(u => u.Age > 18).OrderBy(u => u.Name).ToDictionary(u => u.Id, u => u.Name);
Метод Select позволяет проецировать коллекцию в другой формат без изменения исходной структуры. Например, извлечь только имена пользователей:
var names = users.Where(u => u.Age > 18).OrderBy(u => u.Name).Select(u => u.Name).ToList();
При работе с LINQ важно учитывать производительность: фильтрация и сортировка больших коллекций лучше выполнять в одной цепочке вызовов, чтобы избежать лишних промежуточных коллекций. Методы AsEnumerable и AsQueryable помогают управлять точкой выполнения запросов и оптимизацией.
Разработка мини-игры с использованием событий и таймеров в C#
Для демонстрации работы с событиями и таймерами в C# создадим простую текстовую мини-игру «Ловля падающих объектов». Игровое поле ограничено консолью, игрок управляет объектом, перемещающимся по горизонтали, а объекты падают сверху через регулярные интервалы.
Создание таймера осуществляется с помощью System.Timers.Timer. Таймер отвечает за обновление позиции падающих объектов и проверку столкновений. Интервал задаём в миллисекундах, например timer.Interval = 500; для обновления каждые полсекунды.
События применяются для реагирования на действия игрока и изменения состояния объектов. Используем событие ConsoleKeyInfo для движения игрока влево и вправо. Пример:
while(true) {
var key = Console.ReadKey(true);
if(key.Key == ConsoleKey.LeftArrow) player.MoveLeft();
if(key.Key == ConsoleKey.RightArrow) player.MoveRight();
}
Падающие объекты представляем классом с координатами X и Y, методом UpdatePosition(), вызываемым в событии таймера. Проверка столкновений реализуется через сравнение координат игрока и объекта:
if(fallingObject.Y == player.Y && fallingObject.X == player.X) OnCollision?.Invoke(this, EventArgs.Empty);
Событие OnCollision подписывается на метод, который увеличивает счёт игрока или завершает игру:
player.OnCollision += (sender, e) => { Console.WriteLine(«Столкновение! Игра окончена.»); timer.Stop(); };
Для управления списком падающих объектов используем List<FallingObject>. В событии таймера обновляем позиции всех объектов, удаляем достигшие нижней границы и создаём новые. Это обеспечивает постоянную динамику без блокировки потока интерфейса.
Рекомендуется задавать таймеру AutoReset = true и запускать его методом Start(). Для плавности игры лучше использовать отдельный поток для считывания клавиш, чтобы движения игрока не зависели от обновления объектов.
Такой подход демонстрирует ключевые принципы событийной архитектуры в C#: разделение логики игры и управления событиями, использование таймера для циклических операций и обработку пользовательского ввода без задержек.
Вопрос-ответ:
Какие простые проекты на C# подходят для начинающих?
Для начинающих хорошо подойдут консольные приложения, где можно изучать синтаксис и базовые конструкции. Например, калькулятор, программа для ведения списка задач или игра «Угадай число». Эти проекты помогают понять работу циклов, условий, методов и базовых структур данных.
Можно ли использовать C# для создания графических интерфейсов?
Да, для создания графических интерфейсов на C# обычно используют Windows Forms или WPF. Windows Forms проще для освоения: вы создаёте формы, добавляете кнопки, текстовые поля и настраиваете обработчики событий. WPF позволяет создавать более сложные интерфейсы с поддержкой анимации и современных элементов управления, но требует изучения разметки XAML.
Какие примеры проектов с базами данных можно реализовать на C#?
На C# часто делают приложения, работающие с базами данных SQL Server или SQLite. Например, система учёта книг в библиотеке, приложение для ведения клиентов или простая CRM. Такие проекты учат взаимодействию с базой данных через ADO.NET или Entity Framework, работе с запросами, фильтрацией и отображением данных в таблицах.
Как можно подключить внешние библиотеки в проект C#?
Внешние библиотеки подключаются через NuGet — менеджер пакетов для .NET. В Visual Studio нужно открыть «Управление пакетами NuGet», найти библиотеку и установить её в проект. После этого можно подключать её с помощью директивы using. Например, для работы с JSON популярна библиотека Newtonsoft.Json, которая упрощает сериализацию и десериализацию объектов.
Можно ли на C# создавать небольшие игры?
Да, для создания небольших игр часто используют Unity, которая поддерживает C# как язык сценариев. На начальном уровне можно сделать 2D-игры, например платформеры или пазлы, изучая обработку ввода, управление персонажем и простую физику. Unity также позволяет работать с графикой, анимацией и звуком, что делает проекты более наглядными и интересными.
Какие простые проекты на C# можно использовать для практики новичку?
Для начинающего программиста на C# хороши небольшие проекты, которые демонстрируют работу с консолью, коллекциями и базовыми структурами данных. Например, можно написать калькулятор с консольным интерфейсом, программу для ведения списка дел или простую игру «Угадай число». Такие проекты помогают понять синтаксис языка, принципы работы с переменными, циклами и условиями, а также освоить базовые элементы объектно-ориентированного программирования.
