У меня есть небольшое сомнение относительно бокса и Unboxing в C#.Бокс и Unboxing
код выше можно назвать боксом?
У меня есть небольшое сомнение относительно бокса и Unboxing в C#.Бокс и Unboxing
код выше можно назвать боксом?
Нет, это не бокс. int
является только алиас для System.Int32
. Этот код эквивалентен:
int i = 1;
int j = i;
для бокса произойти, должно быть преобразование в ссылочный тип, например,
int i = 1;
object j = i;
Или:
int i = 1;
IComparable j = i;
No. INT является типом значения.
Бокс происходит, когда вы назначаете тип значения объекту.
Это не бокс.
int
- это псевдоним для System.Int32
. Таким образом, ваш код эквивалентен;
int i = 1;
int j = i;
В боксе, должно быть преобразование к объекта или интерфейса. Подобно;
int i = 1;
object j = i;
Значение типа класса может быть преобразован в тип объекта или к типу интерфейса, который реализуется классом просто путем обработки ссылки в качестве другого типа во время компиляции. Аналогично, значение типа или значение типа интерфейса могут быть преобразованы обратно в класс класса без изменения ссылки (но, конечно, в этом случае требуется проверка типа времени выполнения ).
Просто продлить ответа Джона только немного, бокс будет происходить, когда вы звоните, не являющимся переопределены или не виртуальные методы базового класса также , как
i.GetType(); //boxing occur here
или передать int
к способу, который требует ссылочный тип
void Foo(object obj) {}
Foo(i); //boxing, no overload takes an int
В первом примере IL
вы можете ясно видеть box
инструкции
int i = 5;
i.GetType();
IL_0000: ldc.i4.5
IL_0001: stloc.0 // i
IL_0002: ldloc.0 // i
IL_0003: box System.Int32 //<---- boxing
IL_0008: call System.Object.GetType
Если вы не перегружать виртуальные методы в ваших типов значений, они также будут в штучной упаковке при их вызове
enum MyEnum {}
var e = new MyEnum();
e.ToString(); //box will occur here, see IL for details
IL_0000: ldc.i4.0
IL_0001: stloc.0 // e
IL_0002: ldloc.0 // e
IL_0003: box UserQuery.MyEnum
IL_0008: callvirt System.Object.ToString
В тех же ситуациях с structs, за исключением того, что они будут использовать код операции callvirt
, который будет вставлять структуру, если это необходимо,
Спасибо, bhava, kalale aata. – MaxRecursion