2013-03-22 4 views

ответ

12

Нет, это не бокс. int является только алиас для System.Int32. Этот код эквивалентен:

int i = 1; 
int j = i; 

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

int i = 1; 
object j = i; 

Или:

int i = 1; 
IComparable j = i; 
0

No. INT является типом значения.

Бокс происходит, когда вы назначаете тип значения объекту.

0

Это не бокс.

int - это псевдоним для System.Int32. Таким образом, ваш код эквивалентен;

int i = 1; 
int j = i; 

В боксе, должно быть преобразование к объекта или интерфейса. Подобно;

int i = 1; 
object j = i; 

Значение типа класса может быть преобразован в тип объекта или к типу интерфейса, который реализуется классом просто путем обработки ссылки в качестве другого типа во время компиляции. Аналогично, значение типа или значение типа интерфейса могут быть преобразованы обратно в класс класса без изменения ссылки (но, конечно, в этом случае требуется проверка типа времени выполнения ).

2

Просто продлить ответа Джона только немного, бокс будет происходить, когда вы звоните, не являющимся переопределены или не виртуальные методы базового класса также , как

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, который будет вставлять структуру, если это необходимо,

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