Загальний погляд

Знайомство з новою мовою програмування розумно починати з вивчення системи типів цієї мови. Як в нім влаштована система типів даних? Які є прості типи, як створюються складні, структурні типи, як визначаються власні типи, динамічні типи, як визначаються класи?

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

Класи і об'єкти вперше з'явилися в програмуванні в мові Симула 67. Відбулося це через 10 років після появи першої алгоритмічної мови Фортран. Визначення класу разом з описом даних містило чітке визначення операцій або методів, застосовних до даним. Об'єкти - екземпляри класу є узагальненням поняття змінною. Сьогодні визначення класу в C# і інших об'єктних мовах, аналогічно визначенню типу в CTS, містить:

  • дані, задаючі властивості об'єктів класу;
  • методи, що визначають поведінку об'єктів класу;
  • події, які можуть відбуватися з об'єктами класу.

Так чи є відмінність між цими двома основоположними поняттями - типом і класом? На перших порах можна вважати, що клас - це добре певний тип даних, об'єкт - добре певна змінна. Поняття фактично є синонімами, яке з них вживати лише справу смаку. Вбудовані типи, такі як integer або string, вважають за краще називати як і раніше типами, а їх екземпляри - змінними. Що ж до абстракції даних, що описує службовців і названою, наприклад, Employee, то природніше називати її класом, а її екземпляри - об'єктами. Такий погляд на типи і класи досить корисний, але він не є повним. Пізніше при обговоренні класів і спадкоємства постараємося чіткіше визначити принципові відмінності в цих поняттях.

Об'єктно-орієнтоване програмування, домінуюче сьогодні, побудоване на класах і об'єктах. Проте, поняття типу і змінної все ще залишаються центральними при описі мов програмування, що характерний і для мови C#. Відмітьте, що і в Framework.Net вважають за краще говорити про систему типів, хоча всі типи бібліотеки FCL є класами.

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

Є і інші критерії класифікації типів. Так, типи розділяються на вбудовані типи і типи, визначені програмістом (користувачем). Вбудовані типи спочатку належать мові програмування і складають його базис. У основі системи типів будь-якої мови програмування завжди лежить базисна система типів, вбудованих в мову. На їх основі програміст може будувати власні, ним самим певні типи даних. Але способи (правила) створення таких типів є базисними, вбудованими в мову.

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

Ще одна важлива класифікація типів - це їх ділення на значущих і посилальних. Для значущих типів значення змінної (об'єкту) є невід'ємною власністю змінної (точніше, власністю є пам'ять, що відводиться значенню, а само значення може змінюватися). Для посилальних типів значенням служить посилання на деякий об'єкт в пам'яті, розташований зазвичай в динамічній пам'яті - "купі". Об'єкт, на який указує посилання, може бути таким, що розділяється. Це означає, що декілька посилальних змінних можуть указувати на один і той же об'єкт і розділяти його значення. Значущий тип прийнято називати розгорненим, підкреслюючи тим самим, що значення об'єкту розгорнене безпосередньо в пам'яті, що відводиться об'єкту. Про посилальні і значущі типи ще предстоит грунтовна розмова.

Для більшості процедурних мов, реально використовуваних програмістами, - Паскаль, C++, Java, Visual Basic, C#, - система вбудованих типів більш менш однакова. Завжди в мові присутній арифметичний, логічний (булевий), символьний типи. Арифметичний тип завжди розбивається на підтипи. Завжди допускається організація даних у вигляді масивів і записів (структур). Усередині арифметичного типу завжди допускаються перетворення, завжди є функції, що перетворюють рядок в число і назад. Отже, мій читач, Ваше знання, принаймні, однієї з процедурних мов дозволяє побудувати загальну картину системи типів і для мови C#. Відмінності будуть в нюансах, які і додають аромат і неповторність мові.

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

Основні оператори мови C#

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: