Как "int" назначается объекту? - PullRequest
9 голосов
/ 21 марта 2011

Как мы можем присвоить целое число объекту в .NET?

Типы ссылок получены из System.Object, а типы значений - из System.ValueType.

Итак, какэто возможно?

Ответы [ 9 ]

18 голосов
/ 22 марта 2011

Термин «бокс» очень непрозрачен, но с помощью отладчика легко визуализировать происходящее. Напишите небольшое приложение в консольном режиме, например:

using System;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            int value = 42;
            object obj = value;
        }  // <== Breakpoint here
    }
}

Установите точку останова там, где это указано, и нажмите F5. При достижении точки останова используйте «Отладка + Windows + Память + Память» 1. В поле «Адрес» введите «obj». Вы получите шестнадцатеричный дамп содержимого памяти объекта. Щелкните правой кнопкой мыши окно и выберите «4-байтовое целое число», лучший способ визуализации объекта в этом случае. Вы увидите нечто похожее на это:

0x01CBF6BC  6e1a2d34 0000002a

Интересными частями здесь являются 0x01CBF6BC, это адрес объекта в куче мусора. Следующее шестнадцатеричное число, 6e1a2d34, представляет собой так называемый «дескриптор типа», также известный как «указатель таблицы методов». Это «cookie», который идентифицирует тип объекта. System.Int32 в этом случае. Очень важно, что он будет использован позже, когда объект будет распакован обратно в Int32, чтобы убедиться, что значение в штучной упаковке является целым числом.

Следующее значение, которое вы видите, 0000002a, это значение в штучной упаковке. Вы можете использовать калькулятор Windows в режиме программирования, чтобы преобразовать обратно в десятичное число, это 42.

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

Шестнадцатеричный дамп, который я вам дал, был для 4-байтового коробочного значения, для двойного бокса потребуется 8 байт. Упаковка структуры займет больше байтов. Также есть часть заголовка объекта, которую вы не можете видеть, так называемый syncblock, расположенный по адресу - 4. Попробуйте оператор блокировки, чтобы увидеть это изменение.

13 голосов
/ 21 марта 2011
7 голосов
/ 21 марта 2011

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

Упаковка - это процесс преобразования типа значения в объект типа или в любой тип интерфейса, реализованный этим типом значения.Когда CLR упаковывает тип значения, он помещает значение в System.Object и сохраняет его в управляемой куче.Распаковка извлекает тип значения из объекта.

5 голосов
/ 21 марта 2011

Вы являетесь боксом целым числом в объекте.

То есть создается объект, который обертывает (или коробок )целое число.Вроде как положить что-то в коробку в реальной жизни.

4 голосов
/ 21 марта 2011

Попробуйте этот метод:

object ob;
int i=10;
ob=i;//(boxing)
int b;
b=(int)ob;//(unboxing)
3 голосов
/ 21 марта 2011

Вы должны прочитать о коробках и распаковках в c #, которые должны рассказать вам, как и почему.

Эта ссылка имеет отличное объяснение и объясняет ссылку на вопрос типа значения, о котором вы спрашиваете:

http://www.dijksterhuis.org/exploring-boxing/

Бокс - это просто помещение базового типа в обертку (превращение объекта в полноценный объект) и распаковка, извлечение этого обернутого объекта и преобразование его обратно в более простой тип. Чтобы сделать управляемую память боксом, необходимо выделить ее в куче, ссылки должны быть обновлены, а содержимое типа значения должно быть скопировано.

3 голосов
/ 21 марта 2011

Если вы посмотрите на System.ValueType, оно тоже получится из System.Object

Также см. Как ValueTypes наследуются от Object (ReferenceType) и остаются значениями ValueTypes

1 голос
/ 21 марта 2011

int в .NET имеет базовый объект типа Integer и неявное преобразование.

0 голосов
/ 21 марта 2011

System.ValueType также является производным от System.Object, поэтому:

См. Иерархию наследования здесь:

http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...