Новости

Типи даних в мові C #

Дані, з якими оперують людина і комп'ютер, існують в будь-якій формі: числа, текст, графіка, звук, відео.

У комп'ютері ці дані зберігаються в певному виді - в довічних кодах. Так одне число може кодуватися 1, 2, 4, 8 і більше байтами, текст розглядається як набір символів (1 або 2 байта кожен).

Тому можна говорити про типи даних, кожен з яких повинен оброблятися за своїми правилами. Далі ми дізнаємося, як вони пов'язані з класами і структурами.


Типи даних мають особливе значення в C #, тому що це строго типізований мову. Всі операції піддаються постійному контролю з боку компілятора на відповідність типів, причому неприпустимі операції НЕ компілюються. Отже, контроль типів дозволяє виключити помилки і підвищити надійність програм.

Для забезпечення контролю типів всі змінні, вирази і значення повинні належати до певного типу. Такого поняття, як «безтипових» змінна, в даній мові програмування взагалі не існує. Більш того, тип значення визначає ті операції, які дозволяється виконувати над ним. Операція, дозволена для одного типу даних, може виявитися неприпустимою для іншого.

У C # є дві загальні категорії вбудованих типів даних: типи значень (value type) і посилальні типи (reference type). Їх класифікація приведена на малюнку.

Поняття «вбудовані типи даних» означає, що для визначення змінної обраного типу вам досить вказати одне з ключових слів, зазначених в прямокутниках, і через пробіл ідентифікатор змінної, завершивши запис ;, наприклад:   double d;   string s;   Перший оператор оголошення змінної d забезпечить її розміщення в стеку, зарезервувавши для її значення рівно 8 байт
Поняття «вбудовані типи даних» означає, що для визначення змінної обраного типу вам досить вказати одне з ключових слів, зазначених в прямокутниках, і через пробіл ідентифікатор змінної, завершивши запис ";", наприклад:
double d;
string s;
Перший оператор оголошення змінної d забезпечить її розміщення в стеку, зарезервувавши для її значення рівно 8 байт. Другий оператор зарезервує місце в стеку для посилання на рядок s, вміст якої після її ініціалізації розміститься в купі.

Пояснення термінів:
Стек (stack) і купа (heap) відносяться до різних сегментів оперативної пам'яті.
Стек - це область оперативної пам'яті, яка створюється для кожного потоку. Він працює в порядку LIFO (Last In, First Out), тобто останній доданий в стек шматок пам'яті буде першим у черзі на вихід із стека.
Кожен раз, коли функція оголошує нову змінну, вона додається в стек, а коли ця змінна пропадає з області видимості (наприклад, коли функція закінчується), вона автоматично видаляється з стека. Коли стековая змінна звільняється, ця область пам'яті стає доступною для інших стекових змінних.
Через таку природи стека управління пам'яттю виявляється вельми логічним і простим для виконання на ЦП; це призводить до високої швидкості, особливо тому, що час циклу поновлення байта стека дуже мало, тобто цей байт швидше за все прив'язаний до кешу процесора.
Проте, у такий суворої форми управління є і недоліки. Розмір стека - це фіксована величина, і перевищення ліміту виділеної на стеку пам'яті призведе до переповнення стека. Розмір задається при створенні потоку, і у кожної змінної є максимальний розмір, що залежить від типу даних.
Це дозволяє обмежувати розмір деяких змінних (наприклад, цілочисельних), і змушує заздалегідь оголошувати розмір складніших типів даних (наприклад, масивів), оскільки стек не дозволить їм змінити його. Крім того, змінні, розташовані на стеку, завжди є локальними.

В результаті стек дозволяє управляти пам'яттю найбільш ефективним чином - але якщо вам потрібно використовувати динамічні структури даних або глобальні змінні, то варто звернути увагу на купу.

Купа - це сховище пам'яті, також розташоване в ОЗУ, яке допускає динамічне виділення пам'яті і не працює за принципом стека: це просто склад для ваших змінних.
Коли ви виділяєте в купі ділянку пам'яті для зберігання змінної, до неї можна звернутися не тільки в потоці, але і у всьому додатку. Саме так визначаються глобальні змінні. По завершенні програми всі виділені ділянки пам'яті звільняються.
Розмір купи задається під час запуску програми, але, на відміну від стека, він обмежений лише фізично, і це дозволяє створювати динамічні змінні.

Ви контактуєте з купою за допомогою посилань, зазвичай званих покажчиками - це змінні, чиї значення є адресами інших змінних. Створюючи покажчик, ви вказуєте на місце розташування пам'яті в купі, що задає початкове значення змінної і каже програмі, де отримати доступ до цього значення.
У мові C # передбачена (на відміну від C, C ++) автоматичні збирачі сміття, тому розробнику не потрібно вручну звільняти ділянки пам'яті, які більше не потрібні.

У порівнянні зі стеком, купа працює повільніше, оскільки змінні розкидані по пам'яті, а не сидять на верхівці стека. Некоректне управління пам'яттю в купі призводить до уповільнення її роботи; тим не менш, це не зменшує її важливості - якщо вам потрібно працювати з динамічними або глобальними змінними, користуйтеся купою.

Висновок. Ви познайомилися з поняттями стека і купи.
Якщо коротко, стек - це дуже швидке сховище пам'яті, що працює за принципом LIFO і кероване процесором. Але ці переваги призводять до обмеженого розміру стека і спеціальному способу отримання значень.
Для того, щоб уникнути цих обмежень, можна користуватися купою - вона дозволяє створювати динамічні і глобальні змінні - але керувати пам'яттю повинен або збирач сміття, або сам програміст, та й працює купа повільніше.

В .NET Framework, наприклад, до типу значень з плаваючою точкою відноситься тип double (ключове слово, псевдонім типу). Будь-яке число цього типу займає рівно 8 байт оперативної пам'яті. А число типу decimal займає вже 16 байт (128 біт). Ключове слово char використовується для представлення символу Юникода. Значення символу c har є 16-розрядний числовий (порядкове) значення.

Підказка (про підказку)
Використовуйте інтелектуальну підказку IntelliSense в середовищі програмування замість частого пошуку в Інтернеті. Наберіть в тексті програми ключове слово ushort і просто наведіть мишкою на набране слово. У вікні підказки ви можете прочитати:
struct System.Uint16 Являє 16-бітове ціле без знака.
Слово System, як ви вже знаєте, вказує нам на використання однієї з бібліотек .NET Framework. Без неї, схоже, не обійдеться жодна ваша програма. Через точку вказується вбудований тип даних, що є структурою (struct). Наберіть ключове слово string і наведіть мишкою. Підказка:
class System.String Представляє текст як послідовність знаків Юнікоду
Таким чином, тип String оголошується в класі (class) System.String.
Проробивши подібні дії з іншими зумовленими типами даних, отримаємо таку цікаву таблицю.

Ключове слово Тип даних Що це? Розмір в байтах bool System.Boolean структура 1 byte System.Byte структура 1 char System.Char структура 2 decimal System.Decimal структура 16 double System.Double структура 8 float System.Single структура 4 int System.Int32 структура 4 long System.Int64 структура 8 object System.Object клас - sbyte System.SByte структура 1 short System.Int16 структура 2 string System.String клас - uint System.UInt32 структура 4 ulong System.UInt64 структура 8 ushort System.UInt16 структура 2

Дізнатися розмір пам'яті, що резервується для типів значень (наприклад, long), можна отримати, виконавши оператор: Console.WriteLine (sizeof (long));

Зауважимо, що всі типи даних, що відносяться до типів значень, задаються структурами, два довідкових типу задаються класами. Як дивно просто: зрозуміємо, що таке структура і клас, і зрозуміємо все?

Згадаймо перший принцип ООП - інкапсуляцію і поняття класу. Там вказувалося, що основною одиницею інкапсуляції в C # є клас, який визначає форму об'єкта. Він описує дані, а також код, який буде ними оперувати. У C # опис класу служить для побудови об'єктів, які є екземплярами класу. Тобто, коли ми оголошуємо об'єкт (змінну) класу String, то ми отримуємо доступ до 34 методам (функцій) роботи з рядком, властивості Length (довжина рядка), полю Empty і індексатора.

Структури схожі на класи, тільки проще.В мовою C # примітивні числові типи int, long, float є, як ми з'ясували, псевдонімами для структур System.Int32, System.Int64 і System.Single відповідно. Ці структури мають поля і методи. Наприклад, кожна з перерахованих структур має методи Equals (), GetType (), ToString (). Також у перерахованих структур є деякі властивості - статичні поля, наприклад, Int32.MaxValue або Int32.MinValue.

Виходить, що використовуючи структури, ви знайомі з ними. Повторимо, що хоча структури схожі на класи, все ж існує принципова відмінність, яке полягає в тому, що клас завжди є посилальним типом (reference type), а структури - типом значень (value type).

Головна відмінність структур і класів: структури передаються за значенням (тобто копіюються), об'єкти класів - за посиланням. Саме це є істотною відмінністю в їх поведінці, а навіть не те, де вони зберігаються (в стеці або купі).

Далі ви можете використовувати як готові (зумовлені в бібліотеках, вбудовані) типи для оголошення змінних, так і задавати свої власні структури і класи для створення різних об'єктів, наприклад, масивів.

Відкладемо до наступного розділу визначення класів і структур, їх порівняння і аналіз. Поки будемо використовувати типи даних для оголошення змінних і виконання дій з ними.

Ключове слово Тип даних Що це?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: