Урок по C# №4:Переменные и типы данных. Часть 2
В прошлом уроке вы познакомились с переменными и поняли, что в программировании без них никак. C# -строго типизированный язык, а это значит, что мало объявить переменную –нужно соотнести ее с подходящим типом. А вот теперь обратите внимание – в C# типы данных разделяются на две отличных друг от друга группы. Одна группа включает в себя так называемые типы-значения (value types). Фактически, это обычные примитивные типы данных, которые есть в любом сиподобном языке. Ниже я приведу список этих типов с кратким описанием. Я не буду загружать вас дипазонами значений этих типов – всегда можно посмотреть это, написав простенькую программку для этого. Итак, вот основные базовые типы языка C#:
- char – символьный тип. Предназначен для хранения любых символов в вашей программе.
- bool— логический тип. Может принимать либо true, либо fasle. Переменная, объявленная этим типом будет иметь по-умолчанию true
- byte – байт он, как говорится, и в Африке байт. Это означает, что в него может влезть всего число 0 до 255. Почему 255? Все просто – один байт равен 8 битам. А 2 в степени 8 равно 256. Но у нас есть 0, поэтому предельное число будет 255. Этот тип применяется тогда, когда нужно хранить небольшое значение, например, возраст. Учтите, что если вздумаете присвоить переменной этого типа значение больше 255, то компилятор выдаст ошибку. Кроме того, тип byte является беззнаковым – то есть, он может хранить только положительные числа.
- sbyte – это тот же byte, но только переменная этого типа может иметь отрицательное значение. В этом случае диапазон значений будет лежать от -128 до 127
- int – это тип данных, котором можно хранить только целые числа. Это самый основной тип для манипуляций с целыми числами. Обычно его хватает для большинства задач. Однако изредка может понадобиться хранить очень большое значение или наоборот, маленькое (хотя для маленьких чисел можно также смело ставить тип int). Поэтому тип int разделяется на свои подвиды:
- short – короткое целое число.
- ushort – тоже самое, только без знака.
- long –длинное целое, предназначенное для хранения больших чисел. Больше него только тип decimal. Запомните важную вещь – компилятору нужно указывать принадлежность переменной к данному типу суффиксом L или l. Например, long a=78485994L . Иначе компилятор посчитает переменную типом int.
- ulong – только положительные числа long
- uint –только положительные числа int
- decimal – хранит ну очень большие целые числа. Самое оно для финансовых программ!
- float – содержит дробные числа (так называемые вещественные числа или числа с плавающей точкой) . Подобно типу long требует указание суффикса f .Например, float floatvalue = 34.6f
- double – вещественные числа с двойной точностью после знака запятой. По-умолчанию, это основной тип для всех дробных чисел.
- string – строка. Тут, я думаю, все понятно.
Кроме того, к значимым типам относятся также следующие типы, определяемые пользователем. Это:
- enum – перечисления. О них поговорим в других уроках.
- struct – структуры. Изучим их значительно позже.
В противовес значимым типам в C# была введена вторая группа типов – это ссылочные типы. К ним относятся классы, о которых мы поговорим значительно позже. Почему были введены такие группы? Если думаете, что все это для того, чтобы запутать программиста, то вы ошибаетесь. Дело в том, что тип данных напрямую влияет на производительность вашего кода. Причина этого явления заключается в том, что переменные этих типов данных размещаются в разных областях памяти — в так называемой куче (это вся ваша оперативная память) лежат классы, а в быстрой стековой памяти лежат небольшие по своим размерам типы-значения. Это очень удачных подход, так как работа со стеком очень быстрая. Однако стек имеет очень подлое свойство – он ограничен в своих размерах. Поэтому переменные типов-значений занимают мало памяти иначе просто произойдет переполнение стека, а это не очень приятная вещь. Чтобы этого не случилось, для переменных, занимающих много памяти (это как раз объекты ваших классов) выделяется место в куче. Единственный неприятный момент подобного подхода – переменную гораздо быстрее достать из стека, нежели из кучи. Поэтому в C# был принят подход, в котором в стеке хранится ссылка на область кучи. Это ускоряет работу. Итак, вы уже знаете основные типы данных. Теперь, давайте рассмотрим как объявляются переменные. Синтаксис предельно прост: тип_переменной имя_переменной ; Учтите, что можно объявить сразу несколько переменных одного типа в одной декларации:
int a,b,c,d;
Все четыре переменных будут иметь тип int. Кроме того, в C# допускается присвоение переменной значения сразу же при объявлении:
int a=34, b=12;
C# поддерживает Unicode, а это означает, что можно объявлять имена переменных русскими буквами:
int Первое_число=34;
Но так делать обычно не рекомендуется, хотя сейчас я часто вижу такой подход. Об этом подходе мы поговорим ниже.
Как видите, все просто. А теперь давайте рассмотрим случай, который все больше набирает обороты в российских айти-компаниях.
Помните оператор using? С помощью него мы подключали пространства имен. Однако это не все, что он умеет. Дело в том, что с помощью using можно создавать псевдонимы всех типов. Давайте в качестве примера создадим проект, в котором мы сделаем русские аналоги встроенных типов.
Создайте консольный проект в Visual Studio или Sharp Developer. Назовите его lesson 2 и добавьте в код следующие строки:
using целое=System.Int32; // псевдоним int using дробь=System.Double; //псевдоним double using строка=System.String; //строка using символ=System.Char;
Теперь в коде можно использовать наши псевдонимы вместо англоязычных определений. Посмотрите, например, такой код:
using System; using целое=System.Int32; // псевдоним int using дробь=System.Double; //псевдоним double using строка=System.String; //строка using символ=System.Char; using Консоль=System.Console; //псевдоним класса Console namespace Типы_данных { class Program { public static void Main(string[] args) { строка Имя="Андрей"; Консоль.WriteLine ("Как дела, " + Имя + "?"); целое число1=34; дробь число2=12.3; Console.Write("Нажмите клавишу для выхода . . . "); Console.ReadKey(true); } } }
Занятно выглядит, не так ли? Фактически, можно так «русифицировать» буквально все. Но я не приветствую данный подход. В любом случае, поэкспериментируйте. А пока на этом урок окончен.