Является ли листинг для интерфейса конверсией бокса?

У меня есть интерфейс 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

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