Урок 5. Типы

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

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

Предположим, вам необходимо подсчитать число кошек, проживающих в вашем городе. Для этой цели вам подойдут целые числа (integer), так как трудно представить себе, что вы найдете дробную часть животных, типа 1.5 кошки или 3.14 кота.

Если вы имеете дело с финансами, то удобно использовать десятичные числа (decimal), в которым можно считать рубли и копейки, доллары и центы. У математиков для вычислений часто используются числа с плавающей точкой (floating point).

Давайте пока поработаем с типом integer, к которому относятся как положительные, так и отрицательные целые числа.

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

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

int cats;

Напоминаю, что вы не можете использовать в качестве имени переменной слово int, хотя можете использовать такие имена как INT, Int, inT.

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

На этом моменте следует остановиться подробнее. Как вы понимаете, память компьютера не бесконечна. Вероятно, вы знаете, что в памяти компьютера числа хранятся в виде последовательностей нулей и единиц. Например, для целочисленных значений берется ряд битов (отдельных цифр, которыми может быть О или 1) и представляется число в двоичном (бинарном) формате. Переменная, способная хранить 2 бита, позволить оперировать следующими числами:

0 = 00 
1 = 01 
2 = 10 
3 = 11

В такую переменную можно записать только четыре числа от 0 до 3. Этого вполне достаточно, чтобы использовать такую переменную для подсчета числа хвостов или ушей у любой кошки. Но, если мы захотим посчитать количество лап у кошки, то от такой переменной толку будет мало. Значить, нам нужно иметь переменную, способную хранить 3 бита (3 бита позволяют хранить числа от 0 до 7). Возникает соблазн создать такие типы, которые могут содержать 2, 3, 4, 5 битов и так далее. Но подобный способ неэффективен для компьютера. Вместо этого договорились использовать строго определенные типы, способные хранить разные диапазоны чисел в заранее оговоренных рамках и занимающие разные объемы памяти. Необходимо сначала выучить самые основные типы, которыми вы будете пользоваться. Потом вы запомните и другие типы. Пока достаточно выучить тип int

Тип int

Добавим еще несколько переменных:

int cats;    //число кошек в городе
int dogs;    //число собак в городе
int parrots; //число попугаев в городе 

cats = 400;
dogs = 250;
parrots = 38;

Пустая строка в этом примере не обязательна; она только делает код более наглядным.

Вы можете указывать более одной переменной в одном операторе объявления:

int cats, dogs, parrots;

Эта строка эквивалентна трем отдельным операторам объявления. Если вы объявляете более одной переменной в операторе объявления, то переменные необходимо разделять запятыми. При этом все объявленнные переменные относятся к одному типу, в данном случае к типу int.

Можно сочетать различные способы объявления. Например, объявить некоторые переменные вместе в одном операторе объявления, а другие отдельно:

int cats, dogs;
int parrots;

Также можно объявлять переменные по мере надобности:

int cats;
cats = 400;
int dogs;
dogs = 250;

Единственное правило - каждая переменная должна быть объявлена до ее использования.

Также можно присвоить переменной значение одновременно с объявлением:

int cats = 400;

На первый взгляд, кажется, что мы использовали оператор присваивания. Но на самом деле это оператор объявления. Когда переменной присваивается значение при объявлении, говорят, что переменная инициализируется. Инициализация переменной ничем не отличается от присваивания значения переменной сразу за оператором объявления:

int cats;
cats = 400;

В период между объявлением переменной и присваиванием ей значения эта переменная не инициализирована и не имеет никакого значения. Язык C# не разрешит вам использовать неинициализированную переменную. Например, рассмотрим пример:

int cats, dogs;
int totalAnimals;  // общее число животных, включая кошек и собак
totalAnimals = cats + dogs;

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

Можно в одном операторе объявления инициализировать одни переменные и не инициализировать другие:

int cats, dogs = 260, total;

А можно инициализировать все три переменные в одном операторе объявления:

int cats = 400, dogs = 260, total = cats + dogs;

Тем не менее, для удобства чтения кода лучше использовать короткие выражения:

int cats = 400;
int dogs = 260;
int total = cats + dogs;

Пора закрепить материал и написать простую программу:

class SecondProgram
{
    static void Main()
    {
        int cats, dogs, parrots, total;
        cats = 400;
        dogs = 260;
        parrots = 38;
        total = cats + dogs + parrots;
        System.Console.WriteLine(total);
    }
}

Основные целочисленные типы

Тип int - наиболее распространенный тип, который вы будете использовать в своей практике. У него есть еще другое название - System.Int32. Первое название является частью языка C#, второе - более универсальное и является частью .NET Framework. Какое имя вы будете использовать, зависит от вашего вкуса. Существуют и другие целочисленные типы.

ТипПсевдонимДопустимые значения
sbyteSystem.SByteЦелое число в диапазоне от -128 до 127
byteSystem.ByteЦелое число в диапазоне от 0 до 255
shortSystem.Intl6Целое число в диапазоне от -32768 до 32767
ushortSystem.UIntl6Целое число в диапазоне от 0 до 65535
intSystem.Int32Целое число в диапазоне от -2147483648 до 2147483647
uintSystem.UInt32Целое число в диапазоне от 0 до 4294967295
longSystem.Int64Целое число в диапазоне от -9223372036854775808 до 9223372036854775807
ulongSystem.UInt64Целое число в диапазоне от 0 до 18446744073709551615

Символы u в начале имен некоторых переменных (ushort, uint, ulong) являются сокращением от слова unsigned (без знака), которое указывает на то, что хранить отрицательные числа в переменных этих типов нельзя.

Если вернуться к предыдущему примеру, где мы считали число проживающих в городе котов, собак и попугаев, то можно было бы использовать такое выражения, как short cats вместо int cats. C другой стороны, мы не можем использовать тип sbyte или byte, так как в городе проживает больше котов, чем может хранить переменная указанных типов.

Другие типы данных

Итак, мы использовали в программе переменные типа int, которые могут хранить только целочисленные значения. Для работы с числами с дробной частью нужно использовать типы float и double. Чтобы лучше понять разницу между типами int и double, напишем следующую программу:

class IntDoubleDemo
{
    public static void Main()
    {
        int iVar;   // объявляем переменную типа int
        double dVar;   // объявляем переменную типа double
        iVar = 100;    // присваиваем переменной iVar значение 100
        dVar = 100.0;    // присваиваем переменной dVar значение 100,0

        // Выводим значения переменных на экран
        System.Console.WriteLine("Значение переменной iVar: " + iVar);
        System.Console.WriteLine("Значение переменной dVar: " + dVar);

        // Делим обе переменные на 3
        iVar = iVar / 3;
        dVar = dVar / 3;

        // Выводим значения переменных после деления на экран
        System.Console.WriteLine("Значение переменной iVar после деления: " +  iVar);
        System.Console.WriteLine("Значение переменной dVar после деления: " +  dVar);
    }
}

После запуска программы вы увидите следующее:

Значение переменной iVar: 100
Значение переменной dVar: 100
Значение переменной iVar после деления: 33
Значение переменной dVar после деления: 33,3333333333333

Как видите, после деления значение переменной iVar на 3 получается целое число 33, а дробная часть была отброшена. А при делении значения переменной dVar дробная часть осталась. Таким образом, при необходимости работы с числами с плавающей точкой, ее нужно указать явным образом.

Таким образом мы узнали, что кроме целочисленных переменных, в программах можно использовать переменные трех следующих типов: float, double и decimal.

Практическая работа. Преобразование значений температуры

Мы рассматривали достаточно отвлеченные примеры. Давайте теперь напишем более полезную программу. Например, создадим приложение, которое преобразует значение температуры по шкале Фаренгейта в значение по шкале Цельсия.

Для решения задачи нам понадобятся две переменные типа double, в которых будут храниться значения температур по шкале Фаренгейта и Цельсия. Надеюсь, вы понимаете, почему мы выбрали именно тип double для наших переменных? Вспомните, что когда мы говорим о нормальной температуре человека, то подразумеваем температуру 36.6 градусов по Цельсию, т.е. дробное число.

Для преобразования значений температур по шкале Фаренгейта в шкалу по Цельсию используется формула:

C = 5/9 * (F - 32)

В этой формуле C - значение температуры по шкале Цельсия в градусах, а F - значение температуы по шкале Фаренгейта в градусах.

Итак, создаем новый проект FtoC:

// Программа преобразования значений температур по шкале Фаренгейта
// в значения температур по шкале Цельсия

class FtoC
{
    public static void Main()
    {
        double f;  // содержит значение температуры по Фаренгейту
        double c;  // содержит значение температуры по Цельсию

        // Присваиваем переменной f значение 451 градусов по Фаренгейту
        f = 451.0;

        // Выполняем преобразование по формуле
        c = 5.0 / 9.0 * (f - 32.0);

        System.Console.WriteLine(f + " градус по шкале Фаренгейта равны ");
        System.Console.WriteLine(c + " градусам по шкале Цельсия");
    }
}

Теперь, когда вы будете читать книгу американского фантаста Рэя Бредбери 451 градус по Фаренгейту, вы будет представлять о какой температуре идет речь в привычной нам шкале Цельсия.

Нечисловые типы

Помимо числовых типов, существуют и другие простые типы, которые не связаны с числами.

stringSystem.StringПоследовательность символов
ТипПсевдонимДопустимые значения
charSystem.CharОдиночный символ Unicode, сохраняемый в виде целого числа в диапазоне от 0 до 65535
boolSystem.BooleanБулево значение, которое может иметь вид либо true, либо false

Строка

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

Текстовые символы char

Для хранения отдельных символов в языке C# предусмотрен тип данных char. Так как для символов в C# используется кодировка Unicode, то символы типа char занимают в памяти 2 байта. При использовании символьной переменной сам символ окружают одинарными кавычками:

char charStar; // символ Звездочка
charStar = '*';
Console.WriteLine(charStar); 

Булев тип данных

Булевский тип bool является одним из наиболее часто используемых типов переменных. Наличие переменной, которая может содержать либо значение true, либо значение false, играет очень важную роль в процессе выполнения логики приложения. При помощи типа bool можно выполнить сравнение между значениями переменных или проверить правильности входных данных.

Запомните, что для булева типа данных bool существует только два значения true и false (истинна и ложь) и эти значения и выводятся на экран в виде слов True или False:

bool hasTail; // наличие хвоста
hasTail = true;
System.Console.WriteLine("Верно ли, что у котов есть хвосты: " + hasTail);

Непонятное слово булев тип произошло от имени английского математика Джорджа Буля (George Bool), который является автором булевой логики. Булева логика, бывшая сначала чистой наукой, лежит в основе принципа вычислительных операций большинства используемых компьютеров. Кстати, его дочь - известная английская писательница Этель Лилиан Войнич, автор популярного в советское время романа Овод.

Очень часто булев тип данных используется в операторе if:

if(hasTail) System.Console.WriteLine("Переменная hasTail равна " + hasTail);

Обратите внимание, на короткую запись вместо if(hasTail == true), которую можно использовать, если переменная имеет значение true. А вот еще один пример:

System.Console.WriteLine(10 < 9);

Как вы думаете, что появится на экране? Проверьте самостоятельно. Должно появиться слово False.

Реклама