1. Влаштування памʼяті
Кожен компʼютер має оперативну памʼять. Що це таке, які в неї властивості і, найголовніше, яка з цього вам користь?
Кожна програма (зокрема й програми, написані на C#) перед виконанням завантажується до оперативної памʼяті. В оперативній памʼяті містяться код програми (який виконує процесор) і дані програми (які сама програма розміщує в памʼяті).
Що ж таке оперативна памʼять і на що вона схожа?
Уявіть собі Excel. Аркуш в Excel складається з комірок, і в кожної комірки є свій унікальний номер (A1, A2, … B1, B2). Знаючи номер комірки, завжди можна записати до неї якесь значення або отримати значення, що там зберігається. Памʼять компʼютера влаштовано схожим чином.

Програма та її дані під час роботи зберігаються в памʼяті. Уся памʼять компʼютера подана у вигляді маленьких комірок — байтів. Кожна комірка має свій унікальний номер — 0, 1, 2, 3, … (нумерація починається від нуля). Знаючи номер комірки, ми можемо зберегти до неї дані або прочитати їх звідти. В одних комірках зберігається код програми — набір команд для процесора, в інших — дані цієї програми. Номер комірки також називають адресою комірки.
Процесор уміє виконувати команди із завантаженої в памʼять програми. Майже всі команди процесора мають вигляд: взяти дані з деяких комірок → зробити з ними щось → результат покласти в інші комірки.
Обʼєднуючи сотні простих команд, ми отримуємо складні й корисні операції.
Коли в коді програми оголошують змінну, їй виділяють ділянку ще не використаної памʼяті. Зазвичай це кілька байтів. Під час оголошення змінної обовʼязково потрібно вказати тип інформації, яку програма зберігатиме в ній: числа, текст чи інші дані. Адже без відомостей про тип незрозуміло, якого розміру блок памʼяті треба виділити під змінну.
На зорі компʼютерної індустрії програми працювали безпосередньо з номерами комірок памʼяті, але згодом для зручності програмістів коміркам почали надавати імена. Унікальне імʼя змінної — передусім для зручності програмістів: під час виконання програма чудово впоралася б і з номерами.
2. Змінні в памʼяті
У C# є чотири основні типи даних для зберігання цілих чисел: byte, short, int і long.
| Тип | Розмір, байт | Походження імені |
|---|---|---|
| byte | 1 | Byte, оскільки займає один байт памʼяті |
| short | 2 | Скорочення від Short Integer |
| int | 4 | Скорочення від Integer |
| long | 8 | Скорочення від Long Integer |
Також у C# є два типи для дійсних чисел — float і double:
| Тип | Розмір, байт | Походження імені |
|---|---|---|
| float | 4 | Скорочення від Floating Point Number |
| double | 8 | Скорочення від Double Float |
Щоразу, коли виконання програми доходить до команди створення змінної, їй виділяють невелику ділянку памʼяті (розмір залежить від типу змінної).
int a = 10;
Адресою змінної є адреса першої комірки виділеного під неї блоку памʼяті.
C#-програмам заборонено напряму звертатися до памʼяті. Уся робота з памʼяттю відбувається під жорстким контролем C# і .NET.
3. Тип string у памʼяті
Тип string може зберігати великі обсяги даних, тому це не просто тип даних, а повноцінний обʼєкт.
Самі дані типу string (текст) розміщують у спеціальному обʼєкті, під який виділено памʼять, а адресу цього обʼєкта записують у змінну, для якої також виділено памʼять.

- Змінна a типу int займає 4 байти і зберігає значення 1.
- Змінна b типу int займає 4 байти і зберігає значення 10 555. Пробіл — це розділення розрядів. Дробову частину в коді відокремлюють крапкою.
- Змінна d типу double займає 8 байт і зберігає значення 13.001.
- Змінна str типу string займає 4 байти і зберігає значення D12 — адресу першої комірки обʼєкта, що містить текст.
Обʼєкт типу string (який містить текст) зберігається окремим блоком памʼяті. Адреса його першої комірки зберігається у змінній str.
4. Що відбувається, коли ми присвоюємо
Ще один важливий аспект — як працює операція присвоювання. Наприклад:
int a = 10;
int b = a;
b = 20;
Console.WriteLine(a); // 10
У цьому прикладі в памʼяті створюються дві комірки: одна для a, одна для b. Коли ми пишемо b = a;, копіюється значення (10), а не сама змінна. Зміни в b жодним чином не впливають на a.
Тепер аналогічно, але з рядками:
string s1 = "Hello";
string s2 = s1;
s2 = s2 + " World";
Console.WriteLine(s1); // "Hello"
Console.WriteLine(s2); // "Hello World"
Тут обидві змінні s1 і s2 посилаються на один і той самий рядок "Hello" до моменту зміни. Але коли ми виконуємо s2 = s2 + " World", для s2 створюється новий рядок "Hello World", а s1 і далі посилається на старий рядок "Hello".
5. Чому в програмуванні майже все нумерують від нуля
Часто виникає запитання, чому в програмуванні майже всюди прийнято рахувати від нуля. Річ у тім, що існує чимало ситуацій, коли рахувати від нуля зручніше (хоча трапляються й випадки, коли зручніше рахувати від 1).
Найпростіший приклад — адресація памʼяті. Якщо вашій змінній виділили 4 байти памʼяті і у вас є X — адреса першого байта, то якими будуть адреси всіх байтів? X+0, X+1, X+2, X+3. І ми вже отримали групу байтів з індексами 0, 1, 2, 3.
Коли ми міркуємо про відносну адресу всередині певного блоку даних, природно отримуємо нумерацію від нуля. Це і є перша й найпоширеніша причина лічби від нуля.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ