Читаем Язык программирования C#9 и платформа .NET5 полностью

Противоположная операция также разрешена и называется распаковкой (unboxing). Распаковка представляет собой процесс преобразования значения, хранящегося в объектной ссылке, обратно в соответствующий тип значения в стеке. Синтаксически операция распаковки выглядит как обычная операция приведения, но ее семантика несколько отличается. Среда CoreCLR начинает с проверки того, что полученный тип данных эквивалентен упакованному типу, и если это так, то копирует значение в переменную, находящуюся в стеке. Например, следующие операции распаковки работают успешно при условии, что лежащим в основе типом boxedInt действительно является int:


static void SimpleBoxUnboxOperation

{

  // Создать переменную ValueType (int).

  int myInt = 25;


  // Упаковать int в ссылку на object.

  object boxedInt = myInt;


  // Распаковать ссылку обратно в int.

  int unboxedInt = (int)boxedInt;

}


Когда компилятор C# встречает синтаксис упаковки/распаковки, он выпускает код CIL, который содержит коды операций box/unbox. Если вы просмотрите сборку с помощью утилиты ildasm.exe, то обнаружите в ней показанный далее код CIL:


.method assembly hidebysig static

    void  '<

$>g__SimpleBoxUnboxOperation|0_0' cil managed

{

  .maxstack  1

  .locals init (int32 V_0, object V_1, int32 V_2)

    IL_0000:  nop

    IL_0001:  ldc.i4.s   25

    IL_0003:  stloc.0

    IL_0004:  ldloc.0

    IL_0005:  box        [System.Runtime]System.Int32

    IL_000a:  stloc.1

    IL_000b:  ldloc.1

    IL_000c:  unbox.any  [System.Runtime]System.Int32

    IL_0011:  stloc.2

    IL_0012:  ret

  } // end of method '$'::'<

$>g__SimpleBoxUnboxOperation|0_0'


Помните, что в отличие от обычного приведения распаковка обязана осуществляться только в подходящий тип данных. Попытка распаковать порцию данных в некорректный тип приводит к генерации исключения InvalidCastException. Для обеспечения высокой безопасности каждая операция распаковки должна быть помещена внутрь конструкции try/catch, но такое действие со всеми операциями распаковки в приложении может оказаться достаточно трудоемкой задачей. Ниже показан измененный код, который выдаст ошибку из-за того, что в нем предпринята попытка распаковки упакованного значения int в тип long:


static void SimpleBoxUnboxOperation

{

  // Создать переменную ValueType (int).

  int myInt = 25;


  // Упаковать int в ссылку на object.

  object boxedInt = myInt;


  // Распаковать в неподходящий тип данных, чтобы

  // инициировать исключение времени выполнения.

  try

  {

    long unboxedLong = (long)boxedInt;

  }

  catch (InvalidCastException ex)

  {

    Console.WriteLine(ex.Message);

  }

}


На первый взгляд упаковка/распаковка может показаться довольно непримечательным средством языка, с которым связан больше академический интерес, нежели практическая ценность. В конце концов, необходимость хранения локального типа значения в локальной переменной object будет возникать нечасто. Тем не менее, оказывается, что процесс упаковки/распаковки очень полезен, поскольку позволяет предполагать, что все можно трактовать как System.Object, а среда CoreCLR самостоятельно позаботится о деталях, касающихся памяти.

Давайте обратимся к практическому применению описанных приемов. Мы будем исследовать класс System.Collections.ArrayList и использовать его для хранения порции числовых (расположенных в стеке) данных. Соответствующие члены класса ArrayList перечислены ниже. Обратите внимание, что они прототипированы для работы с данными типа System.Object. Теперь рассмотрим методы Add, Insert и Remove, а также индексатор класса:


public class ArrayList : IList, ICloneable

{

...

  public virtual int Add(object? value);

  public virtual void Insert(int index, object? value);

  public virtual void Remove(object? obj);

  public virtual object? this[int index] {get; set; }

}


Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT