Технология объектно-ориентированного программирования
Типы данных
С# является языком со строгой типизацией. В нем необходимо объявлять тип всех создаваемых программных элементов (например, переменных, объектов, окон, кнопок и т. д.), что позволяет компилятору предотвращать возникновение ошибок, следя за тем, чтобы объектам присваивались значения только разрешенного типа. Тип программного элемента сообщает компилятору о его размере (например, тип int показывает, что объект занимает 4 байта) и возможностях (например, кнопка может быть нарисована, нажата и т. д.).
В С# типы делятся на две группы: базовые типы, предлагаемые языком, и типы, определяемые пользователем. Кроме того, типы С# разбиваются на две другие категории: размерные типы (типы по значению) и ссылочные типы.Почти все базовые типы являются размерными типами. Исключение составляют типы Object и String. Все пользовательские типы, кроме структур, являются ссылочными. Дополнительно к упомянутым типам, язык С# поддерживает типы указателей,однако они используются только с неуправляемым кодом.
Принципиальное различие между размерными и ссылочными типами состоит в способе хранения их значений в памяти. В первом случае фактическое значение хранится в стеке (или как часть большого объекта ссылочного типа). Адрес переменной ссылочного типа тоже хранится в стеке, но сам объект хранится в куче.
Сборщик мусора уничтожает программные элементы в стеке через некоторое время после того, как закончит существование раздел стека, в котором они объявлены. В типичном случае раздел стека определяется методом. То есть, если в пределах метода объявлена локальная переменная, соответствующий программный элемент будет помечен для сборки мусора по окончании метода. Объект в куче подвергается сборке мусора через некоторое время после того, как уничтожена последняя ссылка на него.
Язык С# предлагает обычный набор базовых типов, каждому из них соответствует тип, поддерживаемый общеязыковой спецификацией .NET (CLS). Соответствие базовых типов языка С# и типов платформы .NET гарантирует, что объекты, созданные в С#, могут быть использованы на равных основаниях с объектами, созданными в любом другом языке, удовлетворяющем требованиям .NET CLS (например, в языке VB.NET).
Тип | Размер в байтах | Тип .NET | Описание |
---|---|---|---|
Базовый тип | |||
object | Object | Может хранить все что угодно, т.к. является всеобщим предком | |
Логический тип | |||
bool | 1 | Boolean | true или false |
Целые типы | |||
sbyte | 1 | SByte | Целое со знаком (от -128 до 127) |
byte | 1 | Byte | Целое без знака (от 0 до 255) |
short | 2 | Int16 | Целое со знаком (от -32768 до 32767) |
ushort | 2 | UInt16 | Целое без знака (от 0 до 65535) |
int | 4 | Int32 | Целое со знаком (от -2147483648 до 2147483647) |
uint | 4 | UInt | Целое число без знака ( от 0 до 4 294 967 295) |
long | 8 | Int64 | Целое со знаком (от -9223372036854775808 до 9223372036854775807) |
ulong | 8 | UInt64 | Целое без знака (от 0 до 0fffffffffffffff) |
Вещественные типы | |||
float | 4 | Single | Число с плавающей точкой двойной точности. Содержит значения приблизительно от -1.5*10-45 до +3.4*1038 c 7 значащими цифрами |
double | 8 | Double | Число с плавающей точкой двойной точности. Содержит значения приблизительно от -5. 0*10-324 до -1.7*10308 c 15-16 значащими цифрами |
Символьный тип | |||
char | 2 | Сhar | Символы Unicode |
Строковый тип | |||
string | String | Строка из Unicode-символов | |
Финансовый тип | |||
decimal | 12 | Decimal | Число до 28 знаков с фиксированным положением десятичной точки. Обычно используется в финансовых расчетах. Требует суффикса <<m>> или <<М>> |
Переменные и константы
Переменная представляет собой типизированную область памяти. Программист создает переменную, объявляя ее тип и указывая имя. При объявлении переменной ее можно инициализировать (присвоить ей начальное значение), а затем в любой момент ей можно присвоить новое значение, которое заменит собой предыдущее.
static void Main() { int i=10; //объявление и инициализация целочисленной переменной i Console.WriteLine(i); //просмотр значения переменной i=100; //изменение значение переменной Console.WriteLine(i); }
В языке С# требуется, чтобы переменные были явно проинициализированы до их использования. Проверим этот факт на примере.
static void Main() { int i; Console.WriteLine(i); }
При попытке скомпилировать этот пример в списке ошибок будет выведено следующее сообщение: Use of unassigned local variable 'i' (используется неинициализированная локальная переменная i ).
Однако инициализировать каждую переменную необязательно, но необходимо присвоить ей значение до того, как она будет использована.
Константа - это переменная, значение которой нельзя изменить. Константы бывают трех видов: литералы, символические константы и перечисления.
В операторе присваивания: x=32;
число 32 является литеральной константой. Его значение всегда равно 32 и его нельзя изменить.
Символические константы именуют постоянные значения. Определение символической константы происходит следующим образом:
const <тип> <идентификатор> = <значение>;
Рассмотрим пример:
static void Main() { const int i=10; //объявление целочисленной константы i Console.WriteLine(i); //просмотр значения константы i=100; //ошибка Console.WriteLine(i); }
Перечисления (enumerations) являются альтернативой константам. Перечисление - это особый размерный тип, состоящий из набора именованных констант (называемых списком перечисления).
Синтаксис определения перечисления следующий:
[атрибуты] [модификаторы] enum <имя> [ : базовый тип] {список-перечисления констант(через запятую)};
Базовый тип - это тип самого перечисления. Если не указать базовый тип, то по умолчанию будет использован тип int. В качестве базового типа можно выбрать любой целый тип, кроме char. Пример использования перечисления:
class Program { enum gradus:int { min=0, krit=72, max=100, } static void Main() { Console.WriteLine("минимальная температура=" + (int) gradus.min); Console.WriteLine("критическая температура=" + (int)gradus.krit); Console.WriteLine("максимальная температура=" + (int)gradus.max); } }
- Запись ( int ) gradus.min используется для явного преобразования перечисления к целому типу. Если убрать ( int ), то на экран будет выводиться название констант.
- Символ + в записи "минимальная температура=" + (int) gradus.min при обращении к методу WriteLine означает, что строка "минимальная температура=" будет "склеена" со строковым предствлением значения (int) gradus.min. В результате получится новая строка, которая и будет выведена на экран.