Идентификаторы

Тема 2. Синтаксис языка программирования С#, встроенные типы данных

Синтаксические блоки

Для описания различных синтаксических конструкций будем использовать следующие обозначения: <словосочетание>

В этом месте должно находиться то, что указано словосочетанием. Английское слово, знаки препинания являются обязательными и используются без каких-либо изменений.

::= проговаривается как 'означает' или 'может быть'.

YYYopt Если нечто помечено индексом opt или [], то это может как быть, так и не быть, т.е. не является обязательным.

Например,

Оператор while::=

while (<Условие цикла>)

<Тело цикла>

 

где:

<Условие цикла>::= <Логическое выражение>

<Тело цикла> ::= <Оператор>;

::= <Составной оператор>;

 

 

Алфавит языка программирования С#

Алфавит С# включает в себя:

1. Строчные и прописные буквы латинского алфавита.

2. Цифры от 0 до 9.

3. Символ _ (подчеркивание — также считается буквой);

4. Набор специальных символов: " { }, | [ ] + - %/ \ ; ' : ? < > = ! & # *.

5. Прочие символы.

Алфавит С# служит для построения слов, которые в C# называются лексемами. Различают пять типов лексем:

Ø идентификаторы;

Ø ключевые слова;

Ø знаки (символы) операций;

Ø литералы;

Ø разделители.

Почти все типы лексем (кроме ключевых слов и идентификаторов) имеют собственные правила словообразования, включая собственные подмножества алфавита.

Лексемы отделяются друг от друга специальными символами - разделителями. Этой же цели служит множество пробельных символов, к числу которых относятся пробел, табуляция, символ новой строки и комментарии.

Имена считают идентификаторами. Имена служат для обозначения переменных, типов данных, функций. Часть идентификаторов С# входит в фиксированный словарь ключевых слов. Эти идентификаторы образуют подмножество ключевых слов (они так и называются ключевыми словами). Прочие идентификаторы после специального объявления становятся именами. Рассмотрим правила построения идентификаторов состоящих из букв алфавита:

1. Первым символом идентификатора С# может быть только буква.

2. Следующими символами идентификатора могут быть буквы, цифры и нижнее подчеркивание.

3. Длина идентификатора не ограничена.

Таким образом, любая случайным образом составленная последовательность букв, цифр и знаков подчеркивания с точки зрения грамматики языка идеально подходит на роль имени любого объекта, если только начинается с буквы. Фрагмент программы, содержащий подобную переменную, будет синтаксически безупречен. И все же имеет смысл воспользоваться дополнительной возможностью облегчить восприятие и понимание последовательностей операторов. Для этого достаточно закодировать с помощью имен содержательную информацию. Желательно создавать составные осмысленные имена. В этом случае в одно слово можно втиснуть предложение, которое в доступной форме представит информацию о типе объекта, его назначении и особенностях использования.

Типы данных языка программирования С#

С# является жестко типизированным языком. При его использовании необходимо объявлять тип каждого объекта, который создаете (например, целые числа, числа с плавающей точкой, строки, окна, кнопки и т.д.), а компилятор поможет избежать ошибок, связанных с присвоением переменным значений только того типа, который им соответствует. Тип объекта указывает компилятору размер объекта (например, объект типа int занимает в памяти 4 байта) и его свойства (например, форма может быть видима и невидима, и т.д.). При компиляции программы проходит обязательная проверка соответствия типов. Соответствие типов проверяется в трёх случаях:

1. Присваивание. Например, чтобы нельзя было в целочисленную переменную записать дробную.

2. При вычислении выражений компилятор автоматически приводит тип результата выражения к типу, требующему наибольшее количество памяти аргументов выражения. Например, 2+3*1.5=6.5

3. При вызове методов.

Язык программирования C# подразделяет типы на два вида: встроенные типы, которые определены в языке, и определяемые пользователем типы, которые выбирает программист. С# также подразделяет типы на две другие категории: размерные и ссылочные. Основное различие между ними — это способ, с помощью которого их значения сохраняются в памяти. Размерные типы сохраняют свое фактическое значение в стеке. Ссылочные типы хранят в стеке лишь адрес объекта, а сам объект сохраняется в куче. Определим некоторые новые понятия.

Стек — это структура данных, которая сохраняет элементы по принципу: первым пришел, последним ушел (полная противоположность очереди). Стек относится к области памяти, поддерживаемой процессором, в которой сохраняются локальные переменные. Доступ к стеку во много раз быстрее, чем к общей области памяти, поэтому использование стека для хранения данных ускоряет работу вашей программы. В С# размерные типы (например, целые числа) располагаются в стеке: для их значений зарезервирована область в стеке, и доступ к ней осуществляется по названию переменной. Ссылочные типы (например, объекты) располагаются в куче.

Куча - это оперативная память компьютера. Доступ к ней осуществляется медленнее, чем к стеку. Когда объект располагается в куче, то переменная хранит лишь адрес объекта. Этот адрес хранится в стеке. По адресу программа имеет доступ к самому объекту, все данные которого сохраняются в общем куске памяти (куче).

Язык С# предоставляет программисту широкий спектр встроенных типов, которые соответствуют CLS (Common Language Specification) и отображаются на основные типы платформы .NET. Это гарантирует, что объекты, созданные на С#, могут успешно использоваться наряду с объектами, созданными на любом другом языке программирования, поддерживающем .NET CLS (например, VB.NET).

Каждый тип имеет строго заданный для него размер, который не может изменяться. Представленная ниже таблица 2.1. содержит список простых встроенных типов, предлагаемых С#. Простыми типами называются «примитивные» типы, принадлежащие к группе встроенных предопределённых типов C#. Каждый из типов характеризуется следующими признаками:

1. Какие значения можно хранить в переменных данного типа.

2. Диапазон значений.

3. Объём используемой памяти (для представления одной переменной требуется от 8 до 128 бит).

4. Типы операций, которые можно делать над переменными.

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