упаковка и распаковка, почему оба вывода не являются "System.Object”?
Вопрос
Я получил следующий код:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
Результатом является:
System.Int32
System.Object
Почему они не оба System.Object
?
Решение
Если вы спрашиваете, почему BoxedObject.getType () не возвращает объект .. Проверьте изображение в разделе «Конверсия бокса» на MSDN Page Boxing и Page Page MSDN. Отказ Хороший вопрос, кстати .. По крайней мере, мое понимание вашего вопроса.
Хотя я не могу быть технически правильным, это выглядит
- При перемещении в кучу создан новый объект - Указатель его типа установлен на объект типа исходного типа значения (здесь System.int32). Это объясняет GetType () (а также ошибку, если вы попытаетесь поддержать его в другой тип).
- Фактическое значение затем копируется в этот объект.
Другие советы
То GetType()
Функция возвращает фактический тип экземпляра в переменной.
Даже если ваша переменная объявляется как object
, это на самом деле держа коробка Int32
пример.
Игнорирование темы бокса, все классы наследуют от типа объекта. Это верно для таких типов опорных типов, так и для типов значений. GetType показывает наиболее полученный тип, который в этом случае является System.int32.
Один из немногих раз getType собирается вернуть систему .Object: если вы сделаете это:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
Бокс относится к, когда тип значения указан на ссылочный тип. Как правило, это делается как система .Object. TypeOf вернет наиболее выводный фактический тип, а не тип ссылки.
class A
{
}
class B : A
{
}
class C : B
{
}
object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();
Gettype будет делать подобные вещи для этих типов.
System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
Класс
Кладс
Classc.
Это на самом деле не о боксе; Это о поведении GetType
. Отказ Это возвращает тип стоимость из переменной, не тип переменной был объявлен с участием:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
не будет возвращаться System.Object
либо.
объявления переменных - это информация только о времени компиляции, тогда как выполнение метода - это среда выполнения.Другими словами, GetType() никак не может узнать, какой тип объекта был объявлен, поскольку он может знать только фактический тип объекта во время выполнения.
аналогично, если бы у вас был
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
вызов bInstance.У GetType() нет способа узнать, что переменная была объявлена как тип 'a', и я не думаю, что вы ожидаете, что она вернет 'a' и в этом случае.Однако в приведенном выше примере a - это моя аббревиатура object, а b - для System.Int32