// УРОК 01 — VARIABLES

Типи змінних

C# — мова зі строгою типізацією. Ти повинен сказати компілятору яку саме інформацію зберігаєш. Це не ускладнення — це захист від помилок ще до запуску коду.

Що таке змінна?

Змінна — це іменована комірка в оперативній пам'яті. Коли пишеш int score = 10;, ти резервуєш місце в пам'яті, називаєш його "score" і кладеш туди число 10.

declaring.cs
// Синтаксис: [тип] [ім'я] = [значення]; int score = 0; float speed = 5.5f; bool isAlive = true; string name = "Артур"; // Можна оголосити без значення (але не рекомендую): int lives; lives = 3; // задати значення пізніше

Числові типи

int
Ціле число. Від -2B до 2B. Найчастіший тип.
int hp = 100;
float
Число з комою. Суфікс f обов'язковий!
float x = 3.14f;
double
Точніший float. Без суфікса.
double pi = 3.14;
long
Дуже велике ціле. Суфікс L.
long big = 9B_L;
byte
0..255. Для кольорів, пікселів.
byte r = 255;
decimal
Максимальна точність. Для грошей.
decimal price = 9.99m;
⚠️

float потребує суфікс! Число 7.5 без суфікса — це double, не float. Тому float x = 7.5; — помилка компіляції. Правильно: float x = 7.5f;

bool — логічний тип

Зберігає лише два значення: true або false. Основа будь-якої логіки в програмі.

booleans.cs
bool isDead = false; bool hasKey = false; bool isRunning = true; // bool можна отримати з порівняння: int health = 50; bool isLow = health < 25; // false bool isMax = health == 100; // false

var — автовизначення типу

Якщо ти одразу задаєш значення, компілятор може сам визначити тип. Використовуй var коли тип очевидний з контексту.

var.cs
var score = 100; // компілятор знає: int var speed = 5.0f; // компілятор знає: float var name = "Герой"; // компілятор знає: string // ❌ var без значення — помилка: // var x; → компілятор не знає що це // ✓ тип все одно фіксується навіки: var num = 5; num = 10; // ✓ int → int // num = "text"; → ❌ помилка, num — це int
💡

Порада для початківців: Спочатку пиши типи явно (int, float). Це допоможе їх запам'ятати. Коли освоїшся — var зробить код коротшим.

// КВІЗ

Яке значення має змінна після цього коду?
int x = 10; x = 20; x = 5;

// УРОК 02 — STRINGS

Рядки та символи

string і char — основа будь-якого тексту в програмі. Важлива різниця: string у подвійних лапках, char в одинарних.

strings.cs
string name = "Артур"; // рядок — подвійні лапки char grade = 'A'; // символ — одинарні лапки, ОДИН символ char letter = 'Z'; // ❌ char не може містити більше одного символу: // char wrong = 'AB'; → ПОМИЛКА // Конкатенація рядків: string greeting = "Привіт, " + name + "!"; // Інтерполяція ($ перед рядком) — краще! int hp = 80; string status = $"Гравець: {name}, HP: {hp}"; // "Гравець: Артур, HP: 80" // Verbatim рядок (@ — ігнорує \n, \t): string path = @"C:\Users\Hero\Desktop"; // без @: C:\\Users\\Hero...

Корисні методи string

string_methods.cs
string text = " Hello, World! "; text.Length // 18 (довжина) text.Trim() // "Hello, World!" (прибрати пробіли) text.ToLower() // " hello, world! " text.ToUpper() // " HELLO, WORLD! " text.Contains("World") // true text.Replace("Hello", "Hi") // " Hi, World! " text.Split(',') // [" Hello", " World! "] text.StartsWith(" H") // true text.Substring(2, 5) // "Hello" // Перевірка на пустоту: string empty = ""; string.IsNullOrEmpty(empty) // true string.IsNullOrWhiteSpace(" ") // true
// КВІЗ

Що виведе: string s = $"HP: {50 + 25}"; ?

// УРОК 03 — OPERATORS

Оператори

Оператори — це символи дій. Арифметика, порівняння, логіка. Без них неможливо написати жодного рядка коду.

Арифметичні оператори

arithmetic.cs
int a = 10, b = 3; int sum = a + b; // 13 int diff = a - b; // 7 int mult = a * b; // 30 int div = a / b; // 3 (цілочисельне ділення! не 3.33) int mod = a % b; // 1 (остача від ділення) // Для дробового ділення — float: float fdiv = (float)a / b; // 3.333... // Скорочені присвоєння: a += 5; // a = a + 5 → 15 a -= 2; // a = a - 2 → 13 a *= 2; // a = a * 2 → 26 a /= 2; // a = a / 2 → 13 a++; // a = a + 1 → 14 a--; // a = a - 1 → 13

Оператори порівняння та логіки

ОператорЗначенняПрикладРезультат
==Рівно5 == 5true
!=Не рівно5 != 3true
> / <Більше / Менше10 > 5true
>= / <=Більше або рівно5 >= 5true
&&І (AND)true && falsefalse
||АБО (OR)true || falsetrue
!НЕ (NOT)!truefalse

Тернарний оператор

ternary.cs
// умова ? якщо true : якщо false int hp = 30; string status = hp > 50 ? "Живий" : "Поранений"; // status = "Поранений" int max = a > b ? a : b; // більше з двох чисел
// КВІЗ

Що таке результат 10 % 3?

// УРОК 04 — CONDITIONS

Умови: if та switch

Умови — це розгалуження логіки. Програма "приймає рішення" на основі даних. Без умов код виконувався б завжди однаково — що робить гру нудною.

if_else.cs
int health = 40; if (health >= 75) // ← НЕ МАЄ крапки з комою! { Console.WriteLine("Відмінно!"); } else if (health >= 25) { Console.WriteLine("Обережно!"); } else { Console.WriteLine("Критично!"); } // Виведе: "Обережно!" // Вкладені умови: bool hasArmor = true; if (health < 25) { if (hasArmor) Console.WriteLine("Броня рятує!"); // {} можна опустити для 1 рядка else Console.WriteLine("Ти помер!"); }
⚠️

Крапка з комою! Після if (умова) і else — крапки з комою НЕ ПОТРІБНО. Але після кожного виразу всередині блоку — обов'язкова.

switch — для багатьох варіантів

switch.cs
int day = 3; switch (day) { case 1: Console.WriteLine("Понеділок"); break; case 2: Console.WriteLine("Вівторок"); break; case 3: Console.WriteLine("Середа"); break; // ← виконається це default: Console.WriteLine("Інший день"); break; } // switch expression (C# 8+) — елегантніше: string dayName = day switch { 1 => "Понеділок", 2 => "Вівторок", 3 => "Середа", _ => "Інший" // _ = default }; // ← крапка з комою тут! // switch з рядком: string cmd = "run"; switch (cmd) { case "run": /* біг */ break; case "jump": /* стрибок */ break; case "attack": /* атака */ break; }
// КВІЗ

Що станеться якщо забути break; у case switch?

// УРОК 05 — LOOPS

Цикли

Цикли — повторення блоку коду. Замість 100 рядків — один цикл. Без них немає ніякого більш-менш серйозного алгоритму.

for — коли знаєш кількість

for.cs
// for (початок; умова; крок) for (int i = 0; i < 5; i++) { Console.WriteLine(i); // 0,1,2,3,4 } // Назад: for (int i = 4; i >= 0; i--) { Console.WriteLine(i); // 4,3,2,1,0 } // З кроком 2: for (int i = 0; i <= 10; i += 2) { Console.WriteLine(i); // 0,2,4,6,8,10 } // break — вийти з циклу достроково: for (int i = 0; i < 100; i++) { if (i == 5) break; // зупиниться на 5 } // continue — пропустити поточну ітерацію: for (int i = 0; i < 5; i++) { if (i == 2) continue; // пропустить 2 Console.WriteLine(i); // 0,1,3,4 }

foreach — для колекцій

foreach.cs
int[] numbers = { 10, 20, 30, 40 }; foreach (int n in numbers) { Console.WriteLine(n); // 10, 20, 30, 40 } // foreach по рядку (char!): string word = "Hello"; foreach (char c in word) { Console.WriteLine(c); // H, e, l, l, o }

while та do/while

while.cs
// while — перевірка ПЕРЕД виконанням int count = 0; while (count < 3) { Console.WriteLine(count); count++; } // 0, 1, 2 // do/while — перевірка ПІСЛЯ (мінімум 1 виконання) int x = 100; do { Console.WriteLine("Виконалось!"); // виконається хоч раз x++; } while (x < 5); // ← крапка з комою ОБОВ'ЯЗКОВА тут! // Виведе "Виконалось!" один раз, бо x=100 вже > 5
// КВІЗ

Скільки разів виконається цей цикл?
for (int i = 1; i < 5; i++) {}

// УРОК 06 — COLLECTIONS

Колекції: Array, List, Dictionary

Одна змінна — одне значення. Колекція — контейнер для багатьох значень. Без колекцій неможливо побудувати жоден список, меню чи набір ворогів.

Array — коробка з відсіками

arrays.cs
// Масив — ФІКСОВАНИЙ розмір, нумерація з 0 int[] scores = new int[5]; // [0,0,0,0,0] string[] names = { "Артур", "Мерлін", "Гвіневра" }; scores[0] = 100; // записати Console.WriteLine(scores[0]); // 100 Console.WriteLine(names[1]); // "Мерлін" Console.WriteLine(names.Length); // 3 // Перебір: for (int i = 0; i < names.Length; i++) Console.WriteLine(names[i]); // ❌ Вихід за межі = CRASH: // names[10]; → IndexOutOfRangeException // 2D масив (таблиця): int[,] grid = new int[3, 3]; // 3×3 grid[0, 0] = 1; grid[1, 2] = 5;

List<T> — динамічний масив

lists.cs
using System.Collections.Generic; List<string> items = new List<string>(); items.Add("Меч"); items.Add("Щит"); items.Add("Зілля"); Console.WriteLine(items.Count); // 3 ← Count, не Length! Console.WriteLine(items[0]); // "Меч" items.Remove("Щит"); // видалити за значенням items.RemoveAt(0); // видалити за індексом items.Insert(0, "Лук"); // вставити на позицію items.Clear(); // очистити все bool has = items.Contains("Зілля"); // перевірка int idx = items.IndexOf("Меч"); // індекс (-1 якщо немає) // Ініціалізація з значеннями: List<int> nums = new List<int> { 1, 2, 3, 4, 5 };

Dictionary<TKey, TValue>

dict.cs
Dictionary<string, int> hp = new() { { "Гоблін", 30 }, { "Орк", 100 }, { "Дракон", 500 } }; Console.WriteLine(hp["Орк"]); // 100 hp["Гоблін"] = 25; // оновити hp.Add("Скелет", 40); // додати нову пару hp.Remove("Скелет"); // видалити пару bool has = hp.ContainsKey("Дракон"); // true // Безпечне зчитування (не кине помилку): if (hp.TryGetValue("Ельф", out int elfHp)) Console.WriteLine(elfHp); else Console.WriteLine("Ельфа немає"); // Перебір: foreach (var pair in hp) Console.WriteLine($"{pair.Key}: {pair.Value} HP");
// КВІЗ

Яку властивість використовуємо для отримання кількості елементів у List?

// УРОК 07 — CLASSES

Класи та методи

Клас — це шаблон для створення об'єктів. Він описує що об'єкт ЗНАЄ (поля/properties) та що він ВМІЄ робити (методи).

class_basics.cs
public class Player { // Поля — дані об'єкта public string Name; public int Health; private int _level; // private = тільки всередині класу // Властивість (Property) — контрольований доступ до поля public int Level { get => _level; set => _level = value > 0 ? value : 1; // захист } // Конструктор — викликається при new Player(...) public Player(string name, int hp) { Name = name; Health = hp; _level = 1; } // Методи — поведінка public void TakeDamage(int dmg) { Health -= dmg; if (Health < 0) Health = 0; } public bool IsAlive() => Health > 0; public string GetStatus() => $"[{Name}] HP:{Health} Lv:{_level}"; } // Використання: Player p1 = new Player("Артур", 100); Player p2 = new Player("Мерлін", 60); p1.TakeDamage(30); Console.WriteLine(p1.GetStatus()); // [Артур] HP:70 Lv:1 Console.WriteLine(p1.IsAlive()); // true

static — метод без об'єкта

static.cs
public class MathHelper { // static = не потребує об'єкта, викликається через клас public static int Clamp(int value, int min, int max) { if (value < min) return min; if (value > max) return max; return value; } } // Виклик без new: int hp = MathHelper.Clamp(-5, 0, 100); // 0
// КВІЗ

Ключове слово яке робить поле/метод недоступним ззовні класу?

// УРОК 08 — INHERITANCE

Наслідування

Наслідування — дочірній клас отримує всі члени батьківського класу і може додавати свої або перевизначати існуючі. Це усуває дублювання коду.

inheritance.cs
// Базовий клас public class Animal { public string Name; public Animal(string name) { Name = name; } public virtual void Speak() // virtual = можна override => Console.WriteLine($"{Name} говорить щось"); public void Breathe() // не virtual = не змінюється => Console.WriteLine("*дихає*"); } // Дочірній клас public class Dog : Animal { public string Breed; public Dog(string name, string breed) : base(name) // виклик конструктора батька { Breed = breed; } public override void Speak() // перевизначення => Console.WriteLine($"{Name} гавкає: Гав!"); public void Fetch() // унікальний метод Dog => Console.WriteLine("Приніс паличку!"); } public class Cat : Animal { public Cat(string name) : base(name) {} public override void Speak() => Console.WriteLine($"{Name} нявкає: Няв!"); } // Поліморфізм — різні типи, одна колекція: List<Animal> animals = new() { new Dog("Рекс", "Хаскі"), new Cat("Мурко"), new Dog("Бобік", "Лабрадор") }; foreach (Animal a in animals) a.Speak(); // кожен говорить по-своєму!

interface — контракт

interface.cs
// Interface — тільки оголошення, без реалізації public interface IDamageable { int Health { get; } void TakeDamage(int amount); } // Клас "підписується" на контракт: public class Barrel : IDamageable { public int Health { get; private set; } = 20; public void TakeDamage(int amount) { Health -= amount; if (Health <= 0) Console.WriteLine("Бочка вибухнула!"); } } // Клас може реалізувати кілька інтерфейсів: // public class Boss : Character, IDamageable, IMoveable {}
// КВІЗ

Яке ключове слово у дочірньому класі перевизначає метод батька?

// УРОК 09 — STRUCT VS CLASS

Struct vs Class

Одна з найважливіших відмінностей C# від інших мов. Struct і Class виглядають схоже, але поводяться принципово інакше в пам'яті комп'ютера.

struct
Value type. Стек. Копіювання = нові дані. Без наслідування.
int, float, bool, Vector3
class
Reference type. Купа (heap). Копіювання = посилання. Наслідування є.
Player, Enemy, List, string
struct_vs_class.cs
public struct Point // value type { public float X, Y; public Point(float x, float y) { X = x; Y = y; } } public class Box // reference type { public int Value; } // ═══ STRUCT: копія незалежна ═══ Point a = new Point(1, 2); Point b = a; // ПОВНА КОПІЯ b.X = 999; Console.WriteLine(a.X); // 1 ← a не змінився! // ═══ CLASS: копія — те саме посилання ═══ Box box1 = new Box { Value = 42 }; Box box2 = box1; // ПОСИЛАННЯ на той самий об'єкт box2.Value = 0; Console.WriteLine(box1.Value); // 0 ← box1 теж змінився! // Коли struct? — малі, незмінні дані: координати, кольори, розміри // Коли class? — складна логіка, наслідування, великі об'єкти
ℹ️

Вбудовані struct у C#: int, float, bool, char, double — всі value types. Вони копіюються при передачі в метод. Це означає, що зміни всередині методу не впливають на оригінал.

// УРОК 10 — CASTING

Casting та конвертація

Іноді потрібно перетворити один тип в інший. C# підтримує як автоматичне (implicit), так і примусове (explicit) перетворення.

casting.cs
// IMPLICIT (неявне) — немає ризику втрати int i = 42; float f = i; // int → float: ок, 42.0f double d = i; // int → double: ок long l = i; // int → long: ок // EXPLICIT (явне) — є ризик втрати даних float pi = 3.99f; int piInt = (int)pi; // 3 ← відкидається дробова частина, НЕ округлення! double big = 300.7; int bigInt = (int)big; // 300 // Правильне округлення: int rounded = (int)Math.Round(big); // 301 int floored = (int)Math.Floor(big); // 300 int ceiled = (int)Math.Ceiling(big); // 301 // ═══ Parse — рядок → число ═══ string s = "123"; int n = int.Parse(s); // 123 float fp = float.Parse("3.14"); // 3.14f // ❌ Parse кине FormatException якщо рядок не число: // int.Parse("abc"); → CRASH! // ✓ TryParse — безпечний варіант: bool ok = int.TryParse("abc", out int result); // ok = false, result = 0 — без помилки! // ═══ Convert ═══ int fromStr = Convert.ToInt32("99"); string fromInt = (255).ToString(); string hex = (255).ToString("X"); // "FF" // ═══ as / is — для об'єктів ═══ object obj = "Привіт"; string str = obj as string; // null якщо не вийде (без помилки) if (obj is string s2) Console.WriteLine(s2.ToUpper()); // ПРИВІТ
// КВІЗ

Яке значення матиме int x = (int)9.9f?

// УРОК 11 — LINQ

LINQ — запити до колекцій

LINQ (Language Integrated Query) — один з найпотужніших інструментів C#. Фільтрація, сортування, пошук — одним виразом замість циклів.

📦

Потрібен: using System.Linq; на початку файлу.

linq.cs
using System.Linq; List<int> scores = new() { 42, 78, 15, 95, 61, 33, 87 }; // ── ФІЛЬТРАЦІЯ ── var high = scores.Where(x => x >= 70).ToList(); // [78, 95, 87] // ── СОРТУВАННЯ ── var asc = scores.OrderBy(x => x).ToList(); // [15, 33, 42, 61, 78, 87, 95] var desc = scores.OrderByDescending(x => x).ToList(); // [95, 87, 78, 61, 42, 33, 15] // ── ТРАНСФОРМАЦІЯ ── var doubled = scores.Select(x => x * 2).ToList(); // [84, 156, 30, 190, ...] // ── АГРЕГАЦІЯ ── int max = scores.Max(); // 95 int min = scores.Min(); // 15 double avg = scores.Average(); // 58.71... int total = scores.Sum(); // 411 int cnt = scores.Count(); // 7 // ── ПОШУК ── int first = scores.First(x => x > 80); // 95 int firstD = scores.FirstOrDefault(x => x > 999); // 0 bool any = scores.Any(x => x > 90); // true bool all = scores.All(x => x > 10); // true // ── ЛАНЦЮЖОК ── var result = scores .Where(x => x > 40) .OrderByDescending(x => x) .Take(3) // перші 3 .ToList(); // [95, 87, 78]

LINQ з об'єктами

linq_objects.cs
record Student(string Name, int Grade, string Subject); List<Student> students = new() { new("Аня", 95, "Math"), new("Борис", 72, "Math"), new("Вікторія", 88, "Art"), new("Гліб", 65, "Math"), }; // Тільки студенти Math, відсортовані за оцінкою: var mathTop = students .Where(s => s.Subject == "Math") .OrderByDescending(s => s.Grade) .Select(s => s.Name) .ToList(); // ["Аня", "Борис", "Гліб"] // Середня оцінка Math студентів: double mathAvg = students .Where(s => s.Subject == "Math") .Average(s => s.Grade); // 77.33
🏆

Вітаємо! Ти пройшов увесь базовий курс C#! Тепер ти знаєш типи даних, умови, цикли, колекції, ООП, struct/class, casting та LINQ. Це вже достатньо для написання реальних програм. Наступний крок — курс C# для Unity!