Перейти к основному содержимому

Первая программа на 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Загрузка интерактивного демо…

  1. Скачайте и установите Visual Studio с официальной страницы загрузки (подробнее — Visual Studio — IDE для разработки на C#):
    • Community – бесплатная;
    • Professional, Enterprise, Preview – платные.
  2. Запустите Visual Studio.
  3. Нажмите "Создание проекта".
  4. Вам будет предложен целый ряд шаблонов – выберем "Консольное приложение (Майкрософт)".
  5. Заполним атрибуты:
    • Имя проекта – HelloWorld;
    • Расположение – укажем папку для хранения проекта;
    • Имя решения – HelloWorld;
    • Можно включить галочку "Поместить решение и проект в одном каталоге". Ниже будет указано, в каком каталоге будет проект. Жмём "Далее".
    • Платформа – выбрать последнюю (к примеру, .NET 8.0);
    • Можем включить поддержку контейнера – но потребуется Docker.
    • Если включаем поддержку контейнера – выбираем ОС контейнера – Linux и тип сборки контейнера – Dockerfile. Создаём проект.
  6. Справа будет обозреватель решений – это структура проекта. В нашем случае, мы имеем Program.cs – файл с кодом: Console.WriteLine("Hello, World!");
  7. Поскольку проект простой, нам даже ничего и не потребуется, уже можно запускать, нажав на кнопку запуска на панели инструментов – в моём случае, запуск с контейнером, поэтому будет написано "Dockerfile":

image-2.png

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

image-3.png

  1. Сборка выполняется через ПКМ по проекту или решению – "Собрать" (Build).

  2. Если открыть папку решения в проводнике, мы увидим файлы проекта – Dockerfile, HelloWorld.csproj, HelloWorld.sln.

image-4.png

  1. Собранная программа сохраняется по пути:

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

image-5.png

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

image-6.png

  1. Для запуска на Windows ничего не потребуется – достаточно открыть исполняемый файл HelloWorld.exe. Но конкретно наша программа закроется сразу – это связано с тем, что в её коде ничего нет – после вывода текста Hello World! программа завершит свою работу.

Усложним задачу – добавим паузу перед закрытием консоли, и добавим юнит-тесты с использованием xUnit.

  1. Изменим код – добавим к коду класс, метод, и ожидание нажатия клавиши:

Код ITЗагрузка примера кода…

Разбор:

  • using System; подключает базовые классы .NET, включая Console.
  • Main(string[] args) — точка входа приложения, где начинается выполнение.
  • Console.WriteLine выводит сообщения в консоль.
  • Console.ReadLine() ждёт ввод, поэтому окно не закрывается сразу после вывода.

Теперь программа будет ждать нажатия клавиши после вывода текста, прежде чем закроется:

image-7.png

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

image-8.png

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

image-9.png

  1. Выбираем тип шаблона – Тестовый проект xUnit (Майкрософт).

  2. Назовём проект "HelloWorld.Tests".

  3. После создания Visual Studio автоматически создаст тестовый проект с файлом UnitTest1.cs.

  4. Теперь нам нужно связать тестовый проект с основным. Для этого нажимаем ПКМ на тестовом проекте – Добавить – Ссылка на проект – выбираем наш проект HelloWorld – ОК.

  5. Создадим отдельный класс. В основном проекте HelloWorld добавляем новый класс HelloService.cs:

image-10.png

Добавляем код в наш новый HelloService.cs

namespace HelloWorld
{
public class HelloService
{
public string GetMessage()
{
return "Hello, World!";
}
}
}

Разбор:

  • Класс HelloService выделяет отдельную ответственность — формирование сообщения.
  • public делает класс доступным из других проектов (например, тестового).
  • Метод GetMessage() возвращает строку без побочных эффектов.
  • Такой код проще переиспользовать и покрывать unit-тестами.
  1. Изменим Program.cs, чтобы использовать новый класс:

Код ITЗагрузка примера кода…

Разбор:

  • var service = new HelloService(); создаёт экземпляр сервисного класса.
  • Вызов service.GetMessage() получает данные из отдельной бизнес-логики.
  • Console.WriteLine(...) отвечает только за отображение в консоли.
  • Это базовый пример разделения обязанностей между слоями кода.
  1. Пишем юнит-тест в UnitTest1.cs:

Код ITЗагрузка примера кода…

Разбор:

  • using Xunit; подключает API тестового фреймворка xUnit.
  • Атрибут [Fact] помечает метод как отдельный тест.
  • Структура Arrange/Act/Assert делает сценарий читаемым и стандартизированным.
  • Assert.Equal(...) проверяет соответствие ожидаемого и фактического результата.
  1. Запускаем Test Explorer (Обозреватель тестов):

image-11.png

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

image-12.png

Усложним ещё. Теперь добавим инструменты логирования, к примеру, Serilog. Но здесь нам понадобится устанавливать дополнительные пакеты, так мы и познакомимся с NuGet.

  1. Переходим в менеджер пакетов NuGet через ПКМ по основному проекту – Управление пакетами NuGet – Обзор – пишем Serilog – выбираем и устанавливаем:

image-13.png

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

image-14.png

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

image-15.png

И выполнить там команды:

Install-Package Serilog
Install-Package Serilog.Sinks.Console

Разбор:

  • Первая команда устанавливает основную библиотеку Serilog.
  • Вторая подключает sink для вывода логов в консоль.
  • Команды выполняются в Package Manager Console и обновляют зависимости проекта.
  • После установки становятся доступны API конфигурации логгера в коде.
  1. Настроим логгер – для этого нам понадобится изменить Program.cs:

Код ITЗагрузка примера кода…

Разбор:

  • Log.Logger = new LoggerConfiguration()...CreateLogger(); инициализирует глобальный логгер приложения.
  • WriteTo.Console() задаёт канал вывода логов в консоль.
  • В try пишутся информационные логи о ходе выполнения через Log.Information(...).
  • В catch критическая ошибка фиксируется через Log.Fatal(ex, ...) вместе со стеком исключения.
  • Log.CloseAndFlush() в finally гарантирует сброс буфера логов перед завершением процесса.
  1. При запуске мы увидим логи в консоли:

image-16.png

Вот так пишется программа на C#.

Этого пока достаточно. Если вы успешно проделали эти шаги, вы:

  • ознакомились с IDE Visual Studio;
  • успешно собрали и запустили программу;
  • подключили пакеты и добавили xUnit;
  • написали модульный тест (юнит-тест);
  • добавили логирование при помощи Serilog;
  • а если вы ещё и справились c Docker – вы герой!

Частые ошибки

СимптомПричина
Проект не открываетсяНе та версия .NET SDK — dotnet --list-sdks
Тесты не видят классinternal без InternalsVisibleTo
Serilog не пишет в файлНеверный путь или нет Log.CloseAndFlush()
NuGet restore failedПрокси/сеть — повторите restore в VS

Что попробовать

  1. dotnet new console в терминале — тот же Hello без Visual Studio.
dotnet new console

Разбор:

  • Команда CLI создаёт новый консольный проект из встроенного шаблона .NET.
  • Генерируются ключевые файлы: Program.cs и файл проекта .csproj.
  • Это быстрый старт без Visual Studio, только через терминал.
  • Обычно следующий шаг — запуск проекта командой dotnet run.
  1. Blazor или MAUI на том же SDK.
  2. API: ASP.NET Core.

Частые ошибки

СимптомПричина
Проект не открываетсяНе та версия .NET SDK — dotnet --list-sdks
Тесты не видят классinternal без InternalsVisibleTo
Serilog не пишет в файлНеверный путь или нет Log.CloseAndFlush()
NuGet restore failedПрокси/сеть — повторите restore в VS

Что попробовать

  1. dotnet new console в терминале — тот же Hello без Visual Studio.
dotnet new console
  1. Blazor или MAUI на том же SDK.
  2. API: ASP.NET Core.

В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на Go, Первая программа на C++, Первая программа на PHP, Первая программа на TypeScript, Первая программа на Java, Первая программа на Node.js.