Преобразование встроенных типов данных. Переменные одного типа можно преобразовывать в переменные другого типа
Переменные одного типа можно преобразовывать в переменные другого типа. Преобразование бывает явным и неявным. Неявное преобразование выполняет компилятор.
Пример неявного преобразования:
static void Main(string[] args)
{
int a = 35;
short b = 10;
a = b; // неявное преобразование. Так как int большего размера, чем short – утери данных не будет
b = a; // ошибка компиляции, нельзя тип большего размера неявно преобразовать в тип меньшего размера
}
При явном преобразовании необходимо непосредственно перед переменной, которую вы хотите преобразовать, указать в скобках тип, к которому приводится переменная.
Пример явного преобразования:
static void Main(string[] args)
{
int a = 35000;
short b = 10;
b = (short) a; // в этом случае уже ошибки не будет. Так как максимальное значение типа short 32767, здесь будет утеря данных.
}
Константы
Константа – это переменная, значение которой нельзя изменить. Константы используются для гарантирования того, что данные в этой переменной не изменятся.
Для того, чтобы объявить константу, перед обычным объявлением переменной нужно добавить ключевое слово const:
static void Main(string[] args)
{
const int months = 12; // объявление константы
months = 13; // ошибка компиляции
}
При объявлении константы она должна обязательно быть проинициализирована значением.
Константы также делают ваш код более красивым, читаемым.
static void Main(string[] args)
{
const int months = 12;
const int monthSalary = 1024;
int yearSalary = monthSalary * months;
}
Гораздо понятнее чем:
static void Main(string[] args)
{
int yearSalary = 12 * 1024;
}
Константы могут быть двух типов: простые литералы и строчные:
static void Main(string[] args)
{
Console.WriteLine(100); // 100 есть 100 и этого не изменить, это константа, а точнее числовой литерал
Console.WriteLine("Hello!"); // строка “Hello!” является строчным литералом
}
Здесь стоит отличать константы от переменных-констант, последние имеют имя, как в примере с месяцами и зарплатой.
Ключевое слово var
Начиная с версии C# 3.0 в язык было добавлено ключевое слово var, которое позволяет создавать переменные без явного указания типа данных. Тип данных такой переменной определяет компилятор по контексту инициализации.
static void Main(string[] args)
{
var number = 5; // number будет типа int
var text ="some text"; // text будет типа string
var number2 = 0.5; // number2 будет типа double
}
var сохраняет принцип строгой типизации в Си-шарп. Это означает, что после того, как для переменной уже был определен тип, в нее нельзя записать данные другого типа:
static void Main(string[] args)
{
var number = 5;
number = "some text"; // ошибка, number определен как int
}
Ключевое слово var следует использовать в первую очередь с LINQ выражениями (при работе с базами данных)
static void Main(string[] args)
{
var query = from s in bdContext.Students select s;
}
О LINQ мы будем говорить позже.
Ключевое слово var имеет ограничения по его использованию - var не может быть в качестве:
- поля класса
- аргумента функции
- возвращаемого типа функции
- переменной, которой присваивается null
Нововведение var является достаточно противоречивым среди разработчиков на C#, некоторые используют его где только возможно, другие его избегают (код становится плохо читаемым).
Ссылочные типы
Все типы данных, о которых мы говорили выше, являются структурными. Также существуют ссылочные типы. Из базовых типов к ссылочным относятся object и string.
Тип object является базовым для всех остальных типов данных. Типу string соответствует строка символов Unicode.
Пример использования типа string.
static void Main(string[] args)
{
string hello = "Hello!";
Console.WriteLine(hello);
}
Структурные типы данных в Си-шарп хранятся в стеке. Для этих данных зарезервирована область в стеке.
Стек — это структура данных, которая сохраняет элементы по принципу «последним пришёл — первым вышел» . Примером из жизни служит стопка тарелок. Скорость работы со стеком гораздо выше, чем с оперативной памятью, следовательно, использование стека повышает скорость работы программы.
Ссылочные типы хранятся в куче.
Куча — это область динамической памяти, которая выделяется приложению для хранения данных (например объектов). Доступ к данным в куче осуществляется медленнее, чем к стеку. Переменные ссылочных типов хранят ссылки на данные.
К ссылочным типам относятся классы, интерфейсы, делегаты и массивы. Больше об этом читайте в уроке Ссылочные типы и типы значений в Си-шарп.
Домашнее задание
Создайте новый проект или откройте предыдущий, объявите несколько переменных различных типов, примените явное и неявное преобразование. Создайте константную переменную, попробуйте изменить ее значение.