Рассмотрим правила построения идентификаторов из букв алфавита.
- Первым символом идентификатора С# может быть только буква.
- Следующими символами идентификатора могут быть буквы, цифры и нижнее подчеркивание.
- Длина идентификатора не ограничена.
Часто бывает полезно вставлять в программу текст, который является комментарием только для читающего программу человека и игнорируется компилятором. В С# это можно сделать одним из двух способов:
- Символы /* начинают комментарий, заканчивающийся символами */. Это особенно полезно для многострочных комментариев и изъятия частей программы при редактировании, однако следует помнить, что комментарии /* */ не могут быть вложенными.
- Символы // начинают комментарий, заканчивающийся в конце строки, на которой они появились.
В С# существует четыре типа литерал:
- Целочисленный литерал;
- вещественный литерал;
- символьный литерал;
- строковый литерал.
Целочисленный литерал служит для записи целочисленных значений и является соответствующей последовательностью цифр (возможно, со знаком '-'). Целочисленный литерал, начинающийся со знака 0, воспринимается как восьмеричное целое. Целочисленный литерал, начинающийся с 0х или 0Х, воспринимается как шестнадцатеричное целое. Непосредственно за литералом могут располагаться в произвольном сочетании один или два специальных суффикса: U (или u) и L (или l).
Вещественный литерал служит для отображения вещественных значений. Он фиксирует запись соответствующего значения в обычной десятичной или научной нотациях. В научной нотации мантисса отделяется от порядка литерой Е (или е). Непосредственно за литералом может располагаться один из двух специальных суффиксов: F (или f) и L (или l).
Значением символьного литерала является соответствующее значение ASCII кода (это, буквы, цифры и специальные символы алфавита С#). Символьный литерал представляет собой последовательность одной или нескольких литер, заключенных в одинарные кавычки. Символьный литерал служит для представления литер в одном из форматов представления. Например, литера Z может быть представлена литералом ‘Z’, а также литералами ‘\132’ и ‘\х5А’. Любая литера может быть представлена в нескольких форматах представления: обычном, восьмеричном и шестнадцатеричном.
Строковые литералы являются последовательностью (возможно, пустой) литер в одном из возможных форматов представления, заключенных в двойные кавычки. Строковые литералы и объединенная последовательность строковых литерал заканчиваются пустой литерой, которая используется как индикатор конца.
Типы данных C#
С# является жестко типизированным языком. При его использовании вы должны объявлять тип каждого объекта, который создаете (например, целые числа, числа с плавающей точкой, строки, окна, кнопки, и т. д.), и компилятор поможет вам избежать ошибок, связанных с присвоением переменным значений только того типа, который им соответствует. Тип объекта указывает компилятору размер объекта (например, объект типа int занимает в памяти 4 байта) и его свойства (например, форма может быть видима и невидима, и т.д.).
Подобно языкам C++ и Java, C# подразделяет типы на два вида: встроенные типы, которые определены в языке, и определяемые пользователем типы, которые создает программист.
В С# существует множество встроенных типов данных. Все типы данных разделяются на две основные разновидности: размерные (структурные) типы (value-based) и ссылочные типы (reference-based). К структурным типам относятся все числовые типы данных (int, float и др.), а также перечисления и структуры. К ссылочным типам относятся массивы, строкииклассы.
Основное различие между ними — это способ, которым их значения сохраняются в памяти. Размерные типы сохраняют свое фактическое значение в стеке.Ссылочные типы хранят в стеке лишь адрес объекта, а сам объект сохраняется в куче. Куча — основная память программ, доступ к которой осуществляется на много медленнее чем к стеку. Если вы работаете с очень большими объектами, то сохранение их в куче имеет много преимуществ.
С# также поддерживает и указатели на типы, но они редко употребляются.
При присвоении одного размерного типа другому присваивается не сам тип (как область памяти), а его побитовая копия. Например:
Ссылочные типы ведут себя иначе. Изменяем struct на class
class Foo {
public int x,y;
}
Поскольку f1 и f2 теперь будут ссылками на один и тот же диапазон памяти в области управляемой кучи, изменение ссылки f2 приводит к тому, что значение х, получаемое через f1, также изменяется.