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; // falsebool isMax = health == 100; // false
var — автовизначення типу
Якщо ти одразу задаєш значення, компілятор може сам визначити тип. Використовуй var коли тип очевидний з контексту.
var.cs
var score = 100; // компілятор знає: intvar speed = 5.0f; // компілятор знає: floatvar 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...
Оператори — це символи дій. Арифметика, порівняння, логіка. Без них неможливо написати жодного рядка коду.
Арифметичні оператори
arithmetic.cs
int a = 10, b = 3;
int sum = a + b; // 13int diff = a - b; // 7int mult = a * b; // 30int 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 == 5
true
!=
Не рівно
5 != 3
true
> / <
Більше / Менше
10 > 5
true
>= / <=
Більше або рівно
5 >= 5
true
&&
І (AND)
true && false
false
||
АБО (OR)
true || false
true
!
НЕ (NOT)
!true
false
Тернарний оператор
ternary.cs
// умова ? якщо true : якщо falseint 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 — крапки з комою НЕ ПОТРІБНО. Але після кожного виразу всередині блоку — обов'язкова.
Цикли — повторення блоку коду. Замість 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
Одна змінна — одне значення. Колекція — контейнер для багатьох значень. Без колекцій неможливо побудувати жоден список, меню чи набір ворогів.
Яку властивість використовуємо для отримання кількості елементів у List?
// УРОК 07 — CLASSES
Класи та методи
Клас — це шаблон для створення об'єктів. Він описує що об'єкт ЗНАЄ (поля/properties) та що він ВМІЄ робити (методи).
class_basics.cs
public classPlayer
{
// Поля — дані об'єктаpublicstring Name;
publicint Health;
privateint _level; // private = тільки всередині класу// Властивість (Property) — контрольований доступ до поляpublicint Level
{
get => _level;
set => _level = value > 0 ? value : 1; // захист
}
// Конструктор — викликається при new Player(...)publicPlayer(string name, int hp)
{
Name = name;
Health = hp;
_level = 1;
}
// Методи — поведінкаpublic voidTakeDamage(int dmg)
{
Health -= dmg;
if (Health < 0) Health = 0;
}
public boolIsAlive() => Health > 0;
publicstringGetStatus() =>
$"[{Name}] HP:{Health} Lv:{_level}";
}
// Використання:
Player p1 = newPlayer("Артур", 100);
Player p2 = newPlayer("Мерлін", 60);
p1.TakeDamage(30);
Console.WriteLine(p1.GetStatus()); // [Артур] HP:70 Lv:1
Console.WriteLine(p1.IsAlive()); // true
static — метод без об'єкта
static.cs
public classMathHelper
{
// static = не потребує об'єкта, викликається через класpublic static intClamp(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 classAnimal
{
publicstring Name;
publicAnimal(string name) { Name = name; }
public virtual voidSpeak() // virtual = можна override
=> Console.WriteLine($"{Name} говорить щось");
public voidBreathe() // не virtual = не змінюється
=> Console.WriteLine("*дихає*");
}
// Дочірній класpublic classDog : Animal
{
publicstring Breed;
publicDog(string name, string breed)
: base(name) // виклик конструктора батька
{
Breed = breed;
}
public override voidSpeak() // перевизначення
=> Console.WriteLine($"{Name} гавкає: Гав!");
public voidFetch() // унікальний метод Dog
=> Console.WriteLine("Приніс паличку!");
}
public classCat : Animal
{
publicCat(string name) : base(name) {}
public override voidSpeak()
=> Console.WriteLine($"{Name} нявкає: Няв!");
}
// Поліморфізм — різні типи, одна колекція:
List<Animal> animals = new()
{
newDog("Рекс", "Хаскі"),
newCat("Мурко"),
newDog("Бобік", "Лабрадор")
};
foreach (Animal a in animals)
a.Speak(); // кожен говорить по-своєму!
interface — контракт
interface.cs
// Interface — тільки оголошення, без реалізаціїpublic interfaceIDamageable
{
int Health { get; }
voidTakeDamage(int amount);
}
// Клас "підписується" на контракт:public classBarrel : IDamageable
{
publicint Health { get; private set; } = 20;
public voidTakeDamage(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 structPoint// value type
{
publicfloat X, Y;
publicPoint(float x, float y) { X = x; Y = y; }
}
public classBox// reference type
{
publicint Value;
}
// ═══ STRUCT: копія незалежна ═══
Point a = newPoint(1, 2);
Point b = a; // ПОВНА КОПІЯ
b.X = 999;
Console.WriteLine(a.X); // 1 ← a не змінився!// ═══ CLASS: копія — те саме посилання ═══
Box box1 = newBox { 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.0fdouble 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); // 301int floored = (int)Math.Floor(big); // 300int ceiled = (int)Math.Ceiling(big); // 301// ═══ Parse — рядок → число ═══string s = "123";
int n = int.Parse(s); // 123float fp = float.Parse("3.14"); // 3.14f// ❌ Parse кине FormatException якщо рядок не число:// int.Parse("abc"); → CRASH!// ✓ TryParse — безпечний варіант:bool ok = int.TryParse("abc", outint 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 asstring; // null якщо не вийде (без помилки)if (obj isstring 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(); // 95int min = scores.Min(); // 15double avg = scores.Average(); // 58.71...int total = scores.Sum(); // 411int cnt = scores.Count(); // 7// ── ПОШУК ──int first = scores.First(x => x > 80); // 95int firstD = scores.FirstOrDefault(x => x > 999); // 0bool any = scores.Any(x => x > 90); // truebool 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
recordStudent(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!