2013-09-03 2 views
0

Возможно, меня могут смутить бокс и распаковка.Un Boxing объект класса - нет ошибки?

Рассмотрим следующее заявление от MSDN:

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

Таким образом, это означает, что unboxing может применяться только к параметру типа значения.

так, это в порядке.

var concernedInteger = (int)myObject; //unboxing is ok. 

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

var concernedClassObject = (TestClass)testClassObject // unboxing is still ok. 

Мой ReSharper не показывает ошибку.

Итак, мой вопрос: «Как вы можете удалить переменную ссылочного типа, когда MSDN говорит, что только типы значений могут быть распакованы»?

ответ

7

Это не распаковка. Это type casting.

Unboxing вытаскивает значение из ссылки в тип значения (при условии, что приведение выполнено успешно). Когда вы перемещаете ссылочные типы вокруг этого, это просто обычное литье.

Бокс и Unboxing - оба типа type casting в любом случае. Причина, по которой им даются специальные имена (бокс и распаковка), заключается в том, что больше происходит в управляемой среде, а не только в нескольких изменяемых таблицах. Вот почему они разделены на термины «бокс» и «распаковка» для типов значений. Но когда дело касается ссылочных типов, это просто литье типов.

+0

спасибо за исправление меня. Но опять же, делает ли тот же синтаксис как для распаковки, так и для литья типов? –

+0

Обновлен мой ответ. Тот же синтаксис да .. разные вещи происходят. –

+0

@nowhewhomustnotbenamed. Тот же синтаксис используется для очень многих вещей: конверсии ссылок, преобразования бокса, распаковки конверсий, числовые преобразования, пользовательские преобразования, преобразования групп методов и, возможно, другие. Они все разные! –

2

что вы здесь делаете TypeCasting не бокс/распаковка. Однако тот же синтаксис, литье используется как для распаковка и явной ссылка переходов

Упаковки и распаковка:

Boxing и unboxing вступают в игру, когда вы закидывающий тип значения и от ссылочного типа, в основном объект

простой boxing и unboxing примером может быть, как

   int i=1; 
      object o=i; /// This is boxing 
      int j = (int)o; /// This is unboxing 

TypeCasting:

Typecasting вызывает преобразование. Тип cast выполняет явное преобразование выражения в заданный тип.

(type) expression 

преобразует expression в объект типа type.Давайте рассмотрим пример

long _longval = 1; 
int i = (int)_longval 

Явная отливка на самом деле говорит компилятору, что мы знаем о возможной потере информации, но все же мы должны выполнить бросок. Это нормально для встроенных числовых типов, но может случиться так, что в ссылочных типов это не совсем несовместим .for например

string _mystring="abc"; 
    int i=(int)_mystring; 

Такие выражения литейные компилируется успешно, но они не смогут во время выполнения давая InvalidCastException ошибку ,

с использованием в качестве ключевого слова:

например

MyClass _MyObject = (MyClass) obj; 
    MyClass MyObject = obj as MyClass ; 

Когда бросок терпит неудачу в первой строке кода генерируется исключение, тогда как во второй строке вы получите только нулевой value.Also вы может использовать как только с ссылочными типами, поэтому для типов значений вы должны использовать только обычный метод литья.

+0

Обертка является ссылочным типом .... –

+0

@SimonWhitehead Спасибо, что указали, что вне – Rohit

+0

@Kyle: +1 .. Спасибо большое .. Было очень полезно. еще раз спасибо. –