В ряде случаев возникает необходимость преобразования значащего типа в ссылочный и обратно. В языке С# для этого предусмотрены специальные механизмы, которые получили названия упаковки и распаковки. При упаковке создается класс-оболочка (wrapper) и ему присваивается значение значащей переменой:
int x = 100; // Создаем и инициализируем значащую переменную
object cx = х; // Упаковываем ее
В процессе упаковки в куче создается объект класса-оболочки и ему присваивается значение переменной, взятое из программного стека. При распаковке осуществляются обратные действия:
int y = (int)cx; // Распаковываем переменную
Consile.WriteLine(y); // Будет выведено значение 100
Как видим, для распаковки нужно перед экземпляром класса-оболочки в круглых скобках указать значащий тип, который из него извлекается. Среда исполнения CLR проверяет соответствие значащего типа и данных в куче на принадлежность к совместимым типам. Если совместимость нарушена, возникает исключение InvaldCastException.
При создании экземпляров классов, поля которых относятся к значащим типам, эти поля инициализируются — в них помещается 0. При объявлении переменной значащего типа она не инициализируется и первоначально может иметь любое значение. Компилятор С# проверяет факт инициализации переменных значащего типа и блокирует использование неинициализированных переменных. Следующий фрагмент программы вызовет сообщение об ошибке «Use of unassigned local variable 'I'» («Использование неинициализированной локальной переменной 'I'»):
public static void Main()
{
int I;
Console.WriteLine(I);
}
Если переменную I сделать полем класса, ошибки не будет:
class Program
{
static int I;
public static void Main()
{
Console.WriteLine(I);
}
}
Обратите внимание: инициализация полей объекта осуществляется в ходе работы умалчиваемого конструктора класса или в случае, если поле объявлено с атрибутом static. В последнем случае при первом обращении к статической переменной будет автоматически вызван умалчиваемый конструктор и поле получит умалчиваемое значение.
0 коммент.:
Отправить комментарий