Встроенные типы

advertisement
Переменные и типы данных C#
С# является жестко типизированным языком!
При его использовании вы должны объявлять тип каждого объекта, который создаете
(например, целые числа, числа с плавающей точкой, строки, окна, кнопки, и т. д.), и
компилятор поможет вам избежать ошибок, связанных с присвоением переменным
значений только того типа, который им соответствует. Тип объекта указывает компилятору
размер объекта (например, объект типа int занимает в памяти 4 байта) и его свойства
(например, форма может быть видима и невидима, и т.д.).
Подобно языкам C++ и Java, C# подразделяет типы на два вида:
 встроенные типы, которые определены в языке,
 и определяемые пользователем типы, которые выбирает программист.
При объявлении переменной компилятор отводит ей место в памяти в зависимости от её
типа.
Вспомним! Переменная – это поименованный участок оперативной памяти
компьютера. Каждая переменная встроенного типа имеет следующие
характеристики:
1. тип: определяет размер выделяемой памяти, диапазон хранимых
значений, допустимый набор операций;
2. имя переменной: любое английское название., используется для
доступа к выделенному участку памяти;
3. значение – хранимые в переменной данные.
С# также подразделяет типы на две другие категории: размерные и ссылочные.
Основное различие между ними – это способ, которым их значения сохраняются в памяти.
Размерные типы сохраняют свое фактическое значение в стеке. Ссылочные типы хранят в
стеке лишь адрес объекта, а сам объект сохраняется в куче.
Куча — основная память программ, доступ к которой осуществляется на много
медленнее чем к стеку. Если вы работаете с очень большими объектами, то сохранение их
в куче имеет много преимуществ.
Особенности использования стека и кучи
Стек – часть оперативной памяти, поддерживаемой процессором, в которой сохраняются
локальные переменные.
Стек – это структура данных, которая сохраняет элементы по принципу: первым пришел,
последним ушел (полная противоположность очереди).
Доступ к стеку во много раз быстрее, чем к общей области памяти, поэтому
использование стека для хранения данных ускоряет работу вашей программы. В С#
размерные типы (например, целые, вещественные числа) располагаются в стеке: для их
значений зарезервирована область в стеке, и доступ к ней осуществляется по названию
переменной.
Часто размерные типы называют value-типами
Ссылочные типы (например, пользовательские объекты, компоненты форм, массивы)
располагаются в куче.
Куча – это оперативная память вашего компьютера. Доступ к ней осуществляется
медленнее, чем к стеку. Когда объект располагается в куче, то переменная хранит лишь
адрес объекта. Этот адрес хранится в стеке. По адресу программа имеет доступ к самому
объекту, все данные которого сохраняются в общем куске памяти (куче).
Например, одномерный массив в оперативной памяти хранится так:
«Сборщик мусора» уничтожает объекты, располагающиеся в стеке, каждый раз, когда
соответствующая переменная выходит за область видимости. Таким образом, если вы
объявляете локальную переменную в пределах функции, то объект будет помечен как
объект для «сборки мусора». И он будет удален из памяти после завершения работы
функции.
Объекты в куче тоже очищаются сборщиком мусора, после того как конечная ссылка
на них будет разрушена.
Встроенные типы
Язык С# предоставляет программисту широкий спектр встроенных типов, которые
соответствуют CLS (Common Language Specification) и отображаются на основные типы
платформы .NET. Это гарантирует, что объекты, созданные на С#, могут успешно
использоваться наряду с объектами, созданными на любом другом языке
программирования, поддерживающем .NET CLS (например, VB.NET).
Каждый тип имеет строго заданный для него размер, который не может изменяться. В
отличие от языка C++, в С# тип int всегда занимает 4 байта (т.е не зависит от разрядности
процессора).
Таблица. Список встроенных типов, предлагаемых С#
Тип
Область значений
Размер
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
-2 147 483 648 до 2 147 483 647
(  2 * 10 9 )
Знаковое 32-бит целое
uint
0 до 4 294 967 295 (0  4 * 10 9 )
Беззнаковое 32-бит целое
long
-9 223 372 036 854 775 808 до
9223372036854775807
Знаковое 32-бит целое
(9 * 1018 )
ulong
0 до 18 446 744 073 709 551 615
(0  18 *1018 )
±1,5*10-45 до ±3,4*1033
float
(1,5  10
45
 3,4  10 )
33
±5*10-324 до ±1,7*10306
double
(5  10 324  1,7  10 306 )
Беззнаковое 32-бит целое
4 байта, точность – 7
разрядов
8 байт, точность – 16
разрядов
12 байт, точность – 28
разрядов
В дополнение к этим примитивным типам С# может иметь объекты типа enum и struct.
decimal
Преобразование встроенных типов
Объекты одного типа могут быть преобразованы в объекты другого типа неявно или
явно. Неявные преобразования происходят автоматически, компилятор делает это вместо
вас. Явные преобразования осуществляются, когда вы «приводите» значение к другому
типу. Неявные преобразования гарантируют также, что данные не будут потеряны.
Например, вы можете неявно приводить от short (2 байта) к int (4 байта).
Независимо от того, какой значение находится в short, оно не потеряется при
преобразовании к int:
short x = 1;
int у = х; //неявное преобразование
Если вы делаете обратное преобразование, то, конечно же, можете потерять
информацию. Если значение в int больше, чем 32.767, оно будет усечено при
преобразовании. Компилятор не станет выполнять неявное преобразование от int к short:
short х;
int у - 5;
х = у; //не скомпилируете
Вы должны выполнить явное преобразование, используя оператор приведения:
short х;
int у - 5;
х = (short) у;
//OK
Типы данных переменной
К сведениям, хранимым в типе, может относиться следующее:

Место для хранения, необходимое для переменной типа.

Максимальное и минимальное значения, которые могут быть представлены.

Содержащиеся члены (методы, поля, события и т. д.).

Базовый тип, который он наследует.

Расположение, в котором будет выделена память для переменных во время
выполнения.

Разрешенные виды операций.
Компилятор использует сведения о типе, чтобы убедиться, что все операции, выполняемые
в коде, являются типобезопасными.
Можно сохранить несколько переменных одного типа в структуре данных массива.
Массив объявляется указанием типа элементов.
type[] arrayName;
Идентификаторы
Имена операторов, переменных, констант, типов величин, имя самой программы
назначаются программистом и называются идентификаторами. Существуют правила, которым
должны отвечать все идентификаторы:

идентификатор должен быть уникальным, то есть одним и тем же именем разные
объекты не могут быть названы;

идентификатор может состоять только из символов латинского алфавита, цифр и
знака подчеркивания ("_")

идентификатор имеет ограничение по длине (зависит от конкретной реализации
языка на компьютере);

! регистр букв имеет значение;

идентификатор не может начинаться с цифры.

идентификатор не должен совпадать с ключевыми словами языка
//допустимые имена
x , s5 , Ax6 ,
Рекомендуется кодировать
заложенную в переменную.
D_f
с
, _Fm5 , xM_5 , _128
помощью
имён
содержательную
информацию,
Желательно создавать составные осмысленные имена. При создании подобных имён
в одно слово можно "втиснуть" предложение, которое в доступной форме представит
информацию о типе объекта, его назначении и особенностях использования.
Вы можете давать программным объектам любые имена, но необходимо, чтобы они
отличались от зарезервированных слов, используемых языком, потому что компилятор все
равно не примет переменные с "чужими" именами.
Приведем список наиболее часто встречающихся зарезервированных слов:
abstract event new struct as explicit null switch base
extern object this bool false operator throw break finally
out true byte fixed override try case float params typeof
catch for private uint char foreach protected ulong
checked goto public unchecked class if readonly unsafe
const implicit ref ushort continue in return using decimal
int sbyte virtual default interface sealed volatile
delegate internal short void do is sizeof while double
lock stackalloc else long static enum namespace string
Download