Урок2. Змінні, типи даних, константи в Сі-шарп
Змінна - це іменована область пам'яті. У змінну можна записувати дані і зчитувати. Дані, записані в змінної, називаються значенням змінної.
Сі-шарп - мова жорсткої типізації. Кожна змінна повинна бути певного типу даних. Нижче, в таблиці наведені вбудовані типи даних мови Сі-шарп:
Тип |
Область значень |
Розмір |
sbyte |
-128 до 127 |
Знакове 8-біт ціле |
byte |
0 до 255 |
Безнакове 8-біт ціле |
char |
U+0000 до U+ffff |
16-бітовий символ Unicode |
bool |
true или false |
1 байт |
short |
-32768 до 32767 |
Знакове 16-біт цілое |
ushort |
0 до 65535 |
Безнакове 16-біт ціле |
int |
-2147483648 до 2147483647 |
Знакове 32-біт ціле |
uint |
0 до 4294967295 |
Безнакове 32-біт ціле |
long |
-9223372036854775808 до 9223372036854775807 |
Знакове 64-біт ціле |
ulong |
0 до 18446744073709551615 |
Безнакове 64-біт ціле |
float |
±1,5*10-45 до ±3,4*1033 |
4 байти, точність — 7 розрядів |
double |
±5*10-324 до ±1,7*10306 |
8 байтів, точність — 16 розрядів |
decimal |
16 байт, точність — 28 розрядів |
Для того, щоб використовувати змінну, її спочатку потрібно оголосити:
static void Main(string[] args)
{
int a; // оголошуємо змінну a типу int
a = 5; // записуємо в змінну a число 5
int b, c; // об’явити можна відразу декілька змінних через кому
bool d; // оголошуємо змінну d типу bool
d = true; // записуємо в змінну d значення true (істина)
long e = 10; // при оголошенні змінної можна відразу задати їй значення, це називається ініціалізацією
float f = 5.5f; // щоби записати число з плаваючою комою типу float, потрібно після значення добадавати суфікс f.
char g = 'g'; // оголошення символьної змінної g з її ініціалізацією значенням символа 'g'
}
При використанні змінної, в яку не було записано значення, компілятор видасть помилку "Use of unassigned local variable [variableName]".
static void Main(string[] args)
{
int a;
Console.WriteLine(a); //помилка
}
Мова Сі-шарп чутлива до регістру символів. Змінні max і Max це не одне і те ж. Не забувайте цього, щоб не мати зайвих проблем.
Ім'я змінної має відображати суть даних, які вона відображає. Не варто називати змінні, які ні про що не говорять іменами типу a,b ,c. Використовуйте англійські слова. Висота - height , вік - age і т. д.
НІКОЛИ не використовуйте кириличні символи в іменах змінних.
Перетворення вбудованих типів даних
Змінні одного типу можна перетворювати в змінні іншого типу. Перетворення буває явним і неявним. Неявне перетворення виконує компілятор.
Приклад неявного перетворення:
static void Main(string[] args)
{
int a = 35;
short b = 10;
a = b; // Неявне перетворення. Так як int більшого розміру, ніж short - втрати даних не буде
b = a; // Помилка компіляції, не можна тип більшого розміру неявно перетворити в тип меншого розміру
}
При явному перетворенні необхідно безпосередньо перед змінною, яку ви хочете перетворити, вказати в дужках тип, до якого відводиться змінна.
Приклад явного перетворення:
static void Main(string[] args)
{
int a = 35000;
short b = 10;
b = (short) a; // В цьому випадку вже помилки не буде. Так як максимальне значення типу short 32767, тут буде втрата даних.
}
Константи
Константа - це величина, значення якої не можна змінити. Константи використовуються для гарантування того, що дані в цій змінній не зміняться.
Для того, щоб оголосити константу, перед звичайним оголошенням змінної потрібно додати ключове слово Const:
static void Main(string[] args)
{
const int months = 12; // Оголошення константи
months = 13; // Помилка компіляції
}
При оголошенні константи вона повинна обов'язково бути проініціалізована значенням. Константи також роблять ваш код більш гарнішим, читабельним.
static void Main(string[] args)
{
const int months = 12;
const int monthSalary = 1024;
int yearSalary = monthSalary * months;
}
Набагато зрозуміліше ніж:
static void Main(string[] args)
{
int yearSalary = 12 * 1024;
}
Константи можуть бути двох типів: прості літерали і рядкові:
static void Main(string[] args)
{
Console.WriteLine(100); // 100 є 100 і цього не змінити, це константа, а точніше числовий літерал
Console.WriteLine("Hello!"); // Рядок "Hello!" Є рядковим літералом
}
Тут варто відрізняти константи від змінних-констант, останні мають ім'я, як у прикладі з місяцями і зарплатою.
Ключове слово VAR
Починаючи з версії C # 3.0 в мову було додано ключове слово VAR, яке дозволяє створювати змінні без явної вказівки типу даних. Тип даних такої змінної визначає компілятор по контексту ініціалізації.
static void Main(string[] args)
{
var number = 5; // number буде типу int
var text ="some text"; // text буде типу string
var number2 = 0.5; // number2 буде типа double
}
Var зберігає принцип строгої типізації в Сі-шарп. Це означає, що після того, як для змінної вже був визначений тип, в неї не можна записати дані іншого типу:
static void Main(string[] args)
{
var number = 5;
number = "some text"; // помилка, number визначено як int
}
Ключове слово VAR слід використовувати в першу чергу з LINQ виразами (при роботі з базами даних)
static void Main(string[] args)
{
var query = from s in bdContext.Students select s;
}
Про LINQ ми будемо говорити пізніше.
Ключове слово VAR має обмеження щодо його використання - змінна не може бути в якості:
- Поля класу
- Аргументу функції
- Результату типу функції
- Змінна, яка присвоюється null
Нововведення var є досить суперечливим серед розробників на C#, деякі використовують його де тільки можливо, інші його уникають (код стає погано читаним).
Дані типу посилання
Всі типи даних, про які ми говорили вище, є структурними. Також існують посилальні типи. З базових типів до посилальних відносяться об'єкт і рядок.
Тип об'єкта є базовим для всіх інших типів даних. Типу рядок відповідає рядок символів Unicode.
Приклад використання типу string.
static void Main(string[] args)
{
string hello = "Hello!";
Console.WriteLine(hello);
}
Структурні типи даних в Сі-шарп зберігаються в стеку. Для цих даних зарезервована область в стеку.
Стек - це структура даних, яка зберігає елементи за принципом «останнім прийшов - першим вийшов». Прикладом з життя служить стос тарілок. Швидкість роботи зі стеком набагато вище, ніж з оперативною пам'яттю, отже, використання стека підвищує швидкість роботи програми.
Посилальні типи зберігаються в купі.
Купа - це область динамічної пам'яті, яка виділяється з додатком для зберігання даних (наприклад об'єктів). Доступ до даних в купі здійснюється повільніше, ніж до стека. Змінні посилальних типів зберігають посилання на дані.
До посилальних типів відносяться класи, інтерфейси, делегати та масиви. Про них ми будемо говорити в подальших уроках.
Домашнє завдання
Створіть новий проект або відкрийте попередній, оголосіть кілька змінних різних типів, застосуйте явне і неявне перетворення. Створіть константну змінну, спробуйте змінити її значення.