Первая программа на C#
Play ITЗагрузка интерактивного демо…
Первая программа
C# и Visual Studio - старт в .NET
C# — основной язык .NET: один стек для консоли, веб (ASP.NET), UI (Blazor, MAUI). После установки .NET SDK или Visual Studio вы получаете компилятор, отладчик и шаблоны проектов.
Полный обзор среды (установка, интерфейс, сборка, отладка, тесты) — в статье Visual Studio — IDE для разработки на C#. Кратко — Visual Studio Community бесплатна и полностью подходит для C# + консоль + ASP.NET.
Первая программа — консоль Hello, World! и разбор структуры решения (.sln, .csproj, bin/Debug). Это база перед вебом и десктопом.
Платформа: /encyclopedia/5-languages/5-04-platforma-dotnet/intro.
Выполните шаги ниже и на каждом экране сопоставьте пункт обозревателя решений с файлами на диске.
А теперь давайте немного попрактикуемся и посмотрим, как выглядит работа с C#. Пройдитесь и выполните все действия по алгоритму, но на каждом шаге старайтесь исследовать то, что на экране, чтобы понимать.
Установка программ обычно выглядит так (Visual Studio Installer — тот же сценарий "Далее → рабочие нагрузки"):
Play ITЗагрузка интерактивного демо…
- Скачайте и установите Visual Studio с официальной страницы загрузки (подробнее — Visual Studio — IDE для разработки на C#):
- Community – бесплатная;
- Professional, Enterprise, Preview – платные.
- Запустите Visual Studio.
- Нажмите "Создание проекта".
- Вам будет предложен целый ряд шаблонов – выберем "Консольное приложение (Майкрософт)".
- Заполним атрибуты:
- Имя проекта – HelloWorld;
- Расположение – укажем папку для хранения проекта;
- Имя решения – HelloWorld;
- Можно включить галочку "Поместить решение и проект в одном каталоге". Ниже будет указано, в каком каталоге будет проект. Жмём "Далее".
- Платформа – выбрать последнюю (к примеру, .NET 8.0);
- Можем включить поддержку контейнера – но потребуется Docker.
- Если включаем поддержку контейнера – выбираем ОС контейнера – Linux и тип сборки контейнера – Dockerfile. Создаём проект.
- Справа будет обозреватель решений – это структура проекта. В нашем случае, мы имеем Program.cs – файл с кодом: Console.WriteLine("Hello, World!");
- Поскольку проект простой, нам даже ничего и не потребуется, уже можно запускать, нажав на кнопку запуска на панели инструментов – в моём случае, запуск с контейнером, поэтому будет написано "Dockerfile":

- Запуск выполнит сборку программы и отобразит в окне вывода результат:

-
Сборка выполняется через ПКМ по проекту или решению – "Собрать" (Build).
-
Если открыть папку решения в проводнике, мы увидим файлы проекта – Dockerfile, HelloWorld.csproj, HelloWorld.sln.

-
Собранная программа сохраняется по пути:
HelloWorld\bin\Debug– для Debug сборки (отладочная);HelloWorld\bin\Release– для Release сборки (релизная);
-
Тип сборки меняется через панель инструментов:

- По умолчанию, набор файлов будет содержать следующее:

- Для запуска на Windows ничего не потребуется – достаточно открыть исполняемый файл HelloWorld.exe. Но конкретно наша программа закроется сразу – это связано с тем, что в её коде ничего нет – после вывода текста Hello World! программа завершит свою работу.
Усложним задачу – добавим паузу перед закрытием консоли, и добавим юнит-тесты с использованием xUnit.
- Изменим код – добавим к коду класс, метод, и ожидание нажатия клавиши:
Код ITЗагрузка примера кода…
Разбор:
using System;подключает базовые классы .NET, включаяConsole.Main(string[] args)— точка входа приложения, где начинается выполнение.Console.WriteLineвыводит сообщения в консоль.Console.ReadLine()ждёт ввод, поэтому окно не закрывается сразу после вывода.
Теперь программа будет ждать нажатия клавиши после вывода текста, прежде чем закроется:

Для принудительного закрытия программы используем остановку на панели:

- Добавим юнит-тест. В Visual Studio это будет ещё один проект в составе решения, поэтому нажимаем ПКМ на решении – Добавить – Новый проект:

-
Выбираем тип шаблона – Тестовый проект xUnit (Майкрософт).
-
Назовём проект "HelloWorld.Tests".
-
После создания Visual Studio автоматически создаст тестовый проект с файлом UnitTest1.cs.
-
Теперь нам нужно связать тестовый проект с основным. Для этого нажимаем ПКМ на тестовом проекте – Добавить – Ссылка на проект – выбираем наш проект HelloWorld – ОК.
-
Создадим отдельный класс. В основном проекте HelloWorld добавляем новый класс HelloService.cs:

Добавляем код в наш новый HelloService.cs
namespace HelloWorld
{
public class HelloService
{
public string GetMessage()
{
return "Hello, World!";
}
}
}
Разбор:
- Класс
HelloServiceвыделяет отдельную ответственность — формирование сообщения. publicделает класс доступным из других проектов (например, тестового).- Метод
GetMessage()возвращает строку без побочных эффектов. - Такой код проще переиспользовать и покрывать unit-тестами.
- Изменим Program.cs, чтобы использовать новый класс:
Код ITЗагрузка примера кода…
Разбор:
var service = new HelloService();создаёт экземпляр сервисного класса.- Вызов
service.GetMessage()получает данные из отдельной бизнес-логики. Console.WriteLine(...)отвечает только за отображение в консоли.- Это базовый пример разделения обязанностей между слоями кода.
- Пишем юнит-тест в UnitTest1.cs:
Код ITЗагрузка примера кода…
Разбор:
using Xunit;подключает API тестового фреймворка xUnit.- Атрибут
[Fact]помечает метод как отдельный тест. - Структура Arrange/Act/Assert делает сценарий читаемым и стандартизированным.
Assert.Equal(...)проверяет соответствие ожидаемого и фактического результата.
- Запускаем Test Explorer (Обозреватель тестов):

- Запускаем все тесты и ждём результаты:

Усложним ещё. Теперь добавим инструменты логирования, к примеру, Serilog. Но здесь нам понадобится устанавливать дополнительные пакеты, так мы и познакомимся с NuGet.
- Переходим в менеджер пакетов NuGet через ПКМ по основному проекту – Управление пакетами NuGet – Обзор – пишем Serilog – выбираем и устанавливаем:

- Устанавливаем также Serilog.Sinks.Console:

Второй вариант – просто перейти в Package Manager Console (консоль менеджера пакетов):

И выполнить там команды:
Install-Package Serilog
Install-Package Serilog.Sinks.Console
Разбор:
- Первая команда устанавливает основную библиотеку Serilog.
- Вторая подключает sink для вывода логов в консоль.
- Команды выполняются в Package Manager Console и обновляют зависимости проекта.
- После установки становятся доступны API конфигурации логгера в коде.
- Настроим логгер – для этого нам понадобится изменить Program.cs:
Код ITЗагрузка примера кода…
Разбор:
Log.Logger = new LoggerConfiguration()...CreateLogger();инициализирует глобальный логгер приложения.WriteTo.Console()задаёт канал вывода логов в консоль.- В
tryпишутся информационные логи о ходе выполнения черезLog.Information(...). - В
catchкритическая ошибка фиксируется черезLog.Fatal(ex, ...)вместе со стеком исключения. Log.CloseAndFlush()вfinallyгарантирует сброс буфера логов перед завершением процесса.
- При запуске мы увидим логи в консоли:

Вот так пишется программа на C#.
Этого пока достаточно. Если вы успешно проделали эти шаги, вы:
- ознакомились с IDE Visual Studio;
- успешно собрали и запустили программу;
- подключили пакеты и добавили xUnit;
- написали модульный тест (юнит-тест);
- добавили логирование при помощи Serilog;
- а если вы ещё и справились c Docker – вы герой!
Частые ошибки
| Симптом | Причина |
|---|---|
| Проект не открывается | Не та версия .NET SDK — dotnet --list-sdks |
| Тесты не видят класс | internal без InternalsVisibleTo |
| Serilog не пишет в файл | Неверный путь или нет Log.CloseAndFlush() |
| NuGet restore failed | Прокси/сеть — повторите restore в VS |
Что попробовать
dotnet new consoleв терминале — тот же Hello без Visual Studio.
dotnet new console
Разбор:
- Команда CLI создаёт новый консольный проект из встроенного шаблона .NET.
- Генерируются ключевые файлы:
Program.csи файл проекта.csproj. - Это быстрый старт без Visual Studio, только через терминал.
- Обычно следующий шаг — запуск проекта командой
dotnet run.
- Blazor или MAUI на том же SDK.
- API: ASP.NET Core.
Частые ошибки
| Симптом | Причина |
|---|---|
| Проект не открывается | Не та версия .NET SDK — dotnet --list-sdks |
| Тесты не видят класс | internal без InternalsVisibleTo |
| Serilog не пишет в файл | Неверный путь или нет Log.CloseAndFlush() |
| NuGet restore failed | Прокси/сеть — повторите restore в VS |
Что попробовать
dotnet new consoleв терминале — тот же Hello без Visual Studio.
dotnet new console
- Blazor или MAUI на том же SDK.
- API: ASP.NET Core.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Первые шаги (маршрут подборки) — Первая программа на Go, Первая программа на C++, Первая программа на PHP, Первая программа на TypeScript, Первая программа на Java, Первая программа на Node.js.