.NET, SDK і перша програма
C# — мова, якою пишуть Unity-ігри, банківський бекенд, десктоп під Windows і кросплатформні сервіси. Створена в Microsoft у 2000-му як відповідь Java, за чверть століття вона обігнала прототип у багатьох речах: records, pattern matching, async/await з'явилися тут раніше.
.NET, .NET Framework, Mono — що є що
Плутанина в назвах — перше, об що спотикаються новачки.
- .NET Framework (1.0–4.8) — стара платформа, тільки Windows. Досі жива в корпоративних системах, нових проєктів на ній не починають
- .NET Core → .NET 5+ — сучасна кросплатформна платформа. Просто .NET. Це те, що тобі потрібно
- Mono — стороння реалізація, на якій довго працював Unity
Ми працюємо з сучасним .NET. Актуальна LTS-версія на момент курсу — .NET 8; усе написане працює і в новіших.
Встановлення
Завантаж .NET SDK з dotnet.microsoft.com. SDK містить компілятор, рантайм і CLI. Перевір:
dotnet --version
dotnet --list-sdks
Редактор. Visual Studio (Windows, Community безкоштовна) — найповніший. JetBrains Rider — найкращий кросплатформний. VS Code + розширення C# Dev Kit — легкий варіант, працює скрізь.
Перший проєкт
dotnet new console -o HelloApp
cd HelloApp
dotnet run
Три команди — і в консолі Hello, World!.
Що всередині:
HelloApp/
├── HelloApp.csproj ← опис проєкту
├── Program.cs ← код
└── obj/, bin/ ← результати збірки, у git не кладуть
HelloApp.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Два останні рядки важливі:
ImplicitUsingsавтоматично підключає найчастіші простори імен (System,System.Collections.Generic,System.Linq), тому файл не починається зі стіниusingNullableвмикає перевірку посилань на null. Це найкорисніша річ у сучасному C# — про неї в наступному уроці
Top-level statements
Program.cs у новому проєкті виглядає так:
Console.WriteLine("Hello, World!");
Один рядок. Компілятор сам обгортає це в клас із методом Main. Класичний вигляд теж працює:
namespace HelloApp;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
У навчальних прикладах зручніші top-level statements, у великих проєктах — явний Main.
Трохи коду
Console.Write("Як тебе звати? ");
string? name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("Ім'я не введено.");
return;
}
Console.WriteLine($"Привіт, {name}!");
for (int i = 1; i <= 3; i++)
{
Console.WriteLine($"Рядок {i}");
}
$"…"— інтерполяція рядків, читабельніша за конкатенаціюstring?— рядок, який може бутиnull.Console.ReadLine()справді повертаєnullпри кінці потоку, і компілятор про це нагадає
Як влаштоване виконання
C# не компілюється одразу в машинний код. Крок за кроком:
- Компілятор перетворює
.csна IL — проміжну мову - IL лягає в збірку (
.dllабо.exe) - Під час запуску JIT компілює IL у машинний код конкретного процесора
- CLR керує пам'яттю: виділяє, збирає сміття, стежить за типами
Практичний висновок: перший виклик методу трохи повільніший (JIT працює), далі — швидкість, близька до нативної. І пам'ять ти не звільняєш вручну — це робить збирач сміття.
CLI, який знадобиться
dotnet new console -o Name # консольний проєкт
dotnet new classlib -o Lib # бібліотека
dotnet new webapi -o Api # веб-API
dotnet new sln # рішення
dotnet build # зібрати
dotnet run # зібрати й запустити
dotnet test # тести
dotnet add package Newtonsoft.Json # залежність
dotnet format # форматування
Практика
- Створи консольний проєкт і запусти його.
- Напиши програму, що питає ім'я й рік народження, а виводить вік.
- Обробі випадок, коли рік ввели не числом —
int.TryParseтобі знадобиться. - Відкрий
.csprojі переконайся, щоNullableувімкнено.
Підсумок
- Сучасна платформа називається просто .NET,
.NET Framework— легасі dotnet new/build/run— три команди, які покривають стартImplicitUsingsіNullableу.csprojварто лишати увімкненими- Код → IL → JIT → машинний код; пам'яттю керує GC
Далі — система типів.