Является ли листинг для интерфейса конверсией бокса?
У меня есть интерфейс IEntity
public interface IEntity{
bool Validate();
}
И у меня есть класс Employee, который реализует этот интерфейс
public class Employee : IEntity{
public bool Validate(){ return true; }
}
Теперь, если у меня есть следующий код
Employee emp1 = new Employee();
IEntity ent1 = (IEntity)emp1; // Is this a boxing conversion?
Если это не конверсия бокса, то как работает бросок?
Ответы
Ответ 1
Нет, поскольку Employee
- это класс, который является ссылочным типом, а не тип значения.
От MSDN:
Бокс - это процесс преобразования тип значения для объекта типа или любой тип интерфейса, реализованный этим тип значения. Когда значение CLR указывает значение тип, он обертывает значение внутри System.Object и сохранит его на управляемая куча. Unboxing извлекает тип значения из объекта.
В вышеупомянутой ссылке MSDN есть дополнительные примеры, которые должны помочь прояснить эту тему.
Ответ 2
В приведенном выше примере нет, но иногда да.
Бокс - это процесс "бокса" типа значения в ссылочный объект; ссылочный тип. В приведенном выше примере Employee уже является ссылочным типом, поэтому он не помещается в бокс, когда вы отправляете его в IEntity.
Однако, если Employee был типом значений, например struct (вместо класса), тогда да.
Ответ 3
Как уже говорили другие, приведение ссылочного типа к интерфейсу НЕ является примером бокса, а отличает тип значения к интерфейсу IS.
public interface IEntity {
bool Validate();
}
public class EmployeeClass : IEntity {
public bool Validate() { return true; }
}
public struct EmployeeStruct : IEntity {
public bool Validate() { return true; }
}
//Boxing: A NEW reference is created on the heap to hold the struct memory.
//The struct instance fields are copied into the heap.
IEntity emp2 = new EmployeeStruct(); //boxing
//Not considered boxing: EmployeeClass is already a reference type, and so is always created on the heap.
//No additional memory copying occurs.
IEntity emp1 = new EmployeeClass(); //NOT boxing
//unboxing: Instance fields are copied from the heap into the struct.
var empStruct = (EmployeeStruct)emp2;
//empStruct now contains a full shallow copy of the instance on the heap.
//no unboxing. Instance fields are NOT copied.
var empClass = (EmployeeClass)emp2; //NOT unboxing.
//empClass now points to the instance on the heap.
Ответ 4
Нет.
Поскольку emp1 является ссылочным типом.
Бокс происходит, когда тип значения преобразуется в объект или тип интерфейса.
Ответ 5
Нет, это не так.
Ваш экземпляр Employee уже является ссылочным типом. Справочные типы хранятся в куче, поэтому его не нужно вставлять в коробку/распаковать.
Бокс происходит только при сохранении типа значения в куче или на языке MSDN вы можете сказать:
Бокс - это неявное преобразование Типы значений (С# Reference) к типу объект или любой тип интерфейса реализуемый этим типом значения. Заниматься боксом тип значения выделяет объект экземпляр в куче и копирует значение в новый объект.
Ответ 6
Нет, бокс происходит, когда вы конвертируете тип значения в объект.
Ответ 7
Бокс означает преобразование типа значения в объект. Вы конвертируете ссылочный тип в другой ссылочный тип, поэтому это не конверсия бокса.