2016-03-12 1 views
3

Я знаю о концепции бокса и распаковки C# для преобразования типов. Но как это работает для динамической переменной в C#. Как преобразование типов происходит при использовании динамической переменной. В каком виде он следует принципам бокса и распаковки в C#Как бокс и Unboxing работают для динамического DataType в C#

Я думаю, что бокс и распаковка не обрабатывают динамический тип как объект, поскольку они не одинаковы. Не знаю, будут ли они следующие же механизм для бокса и распаковки или не Смотрите эту ссылку dynamic vs object type

При использовании динамическим, все выражение обрабатывается во время компиляции, как динамическое выражение, которое вызывает компилятор для лечения все как динамические и получить привязку во время выполнения.

это потому, что на ул линии ниже динамична

dynamic str = "22/11/2013 10:31:45 +00:01"; 
    var withOffset = DateTimeOffset.Parse(str); 

В компиляции ул времени является динамическим, тип ул узнать во время выполнения только, что является причиной компилятор лечения withOffset как динамические

+2

Ключевое слово * dynamic * является псевдонимом для * объекта *. Значения всегда в коробке, объекты никогда не помещаются в коробку. Никогда не нужно помогать, и вы не можете. –

+0

Вы пытаетесь сказать, что динамическая переменная и объекты одинаковы. я не уверен в этом –

+0

бокс и распаковка для динамических, а также объекты такие же –

ответ

-1

Бокс

Бокс предназначен для хранения значений типов в собранной мусором куче. Бокс - это неявное преобразование типа значения в объект типа или любой тип интерфейса, реализованный этим типом значения. Бокс тип значения выделяет экземпляр объекта в куче и копирует значение в новый объект. Рассмотрим следующее объявление переменной значение типа:

int i = 123; 

Следующий оператор неявно применяет операцию бокс на переменной I:

// Boxing copies the value of i into object o. 
object o = i; 

В результате этого заявления создающего ссылку на объект O , в стеке, который ссылается на значение типа int в куче. Это значение является копией значения value-type, присвоенного переменной i. Различие между двумя переменными i и o проиллюстрировано на следующем рисунке. enter image description here

распаковка

Распаковка является явным преобразованием из объекта типа к типу значения или от типа интерфейса в тип значения, который реализует интерфейс. Распаковка операция состоит из:

  • Проверки экземпляра объекта, чтобы убедиться, что это коробочное значение данного типа значения.
  • Копирование значения из экземпляра в переменную типа значения.

Следующие утверждения показывают, как бокс и операции приведения:

int i = 123;  // a value type 
object o = i;  // boxing 
int j = (int)o; // unboxing 

На следующем рисунке показан результат предыдущих заявлений. enter image description here

Для освобождения типов значений, которые должны быть успешными во время выполнения, незанятый элемент должен быть ссылкой на объект, который был ранее создан при боксировании экземпляра этого типа значений.Попытка удалить ненулевое значение вызывает NullReferenceException. Попытка освободить ссылку на несовместимый тип значения вызывает InvalidCastException.

Реф. ссылка: Here

+0

ОП спрашивает о 'динамике x = 1' – leppie

+0

@Харыл Ислам. Спасибо за детали. Но на самом деле я знаю подробности о концепции бокса и распаковки. Но я нашел, как это работает для динамических типов, которые были введены в C# –

+0

@leppie и Khairul Islam Является ли обработка C# динамической как объектов, я думаю, что она использует динамическую среду выполнения, которая является слоем поверх CLR –

1

Объект и динамика имеют такое же поведение, когда речь идет о боксе и распаковке (вы можете проверить это в генерируемом IL-коде).

Основные отличия в этом случае, betwen этих 2, является:

  • Среда CLR добавить IL-код во время выполнения, которые определяют его реальный тип и операция, которую можно выполнить на нем (полезной нагрузки).
  • Компилятор позволит вам сделать:

    1.var withOffset = DateTimeOffset.Parse (ул);

    2.DateTimeOffset withOffset = DateTimeOffset.Parse (str);

    3.DateTime withOffset = DateTimeOffset.Parse (str);

    Но во время выполнения clr обеспечивает безопасность типа, поэтому, если вы напишете случай 3, он скомпилируется, но во время выполнения clr будет вызывать исключение RuntimeBinderException.

Надеюсь, это поможет!

Смежные вопросы