Опубликован: 19.02.2009 | Доступ: свободный | Студентов: 3057 / 787 | Оценка: 4.35 / 4.11 | Длительность: 16:28:00
ISBN: 978-5-94774-401-9
Лекция 2:

Технология объектно-ориентированного программирования

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Типы данных

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

В С# типы делятся на две группы: базовые типы, предлагаемые языком, и типы, определяемые пользователем. Кроме того, типы С# разбиваются на две другие категории: размерные типы (типы по значению) и ссылочные типы.Почти все базовые типы являются размерными типами. Исключение составляют типы Object и String. Все пользовательские типы, кроме структур, являются ссылочными. Дополнительно к упомянутым типам, язык С# поддерживает типы указателей,однако они используются только с неуправляемым кодом.

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

Замечание . Стек- это структура, используемая для хранения элементов по принципу первым пришел - последним ушел. В данном случае под стеком понимается область памяти, обслуживаемая процессором, в которой хранятся значения локальных переменных. Куча – область памяти, которая используется для хранения данных, работа с которыми реализуется через указатели и ссылки. Память для размещения таких данных динамически выделяется или освобождается в куче неявно (средствами CLR) или явно (программистом).

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

Язык С# предлагает обычный набор базовых типов, каждому из них соответствует тип, поддерживаемый общеязыковой спецификацией .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);
   }
}
Замечания
  1. Запись ( int ) gradus.min используется для явного преобразования перечисления к целому типу. Если убрать ( int ), то на экран будет выводиться название констант.
  2. Символ + в записи "минимальная температура=" + (int) gradus.min при обращении к методу WriteLine означает, что строка "минимальная температура=" будет "склеена" со строковым предствлением значения (int) gradus.min. В результате получится новая строка, которая и будет выведена на экран.
< Лекция 1 || Лекция 2: 1234 || Лекция 3 >