Является ли приведение к интерфейсу преобразованием бокса?

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

Если это не бокс-конверсия, то как работает актерский состав?


person Hemanshu Bhojak    schedule 23.06.2010    source источник
comment
В этом случае гипс не требуется. Сотрудник реализует интерфейс IEntity, поэтому вы можете свободно назначать ссылку на IEntity (ent1 в вашем примере) любой ссылке на Сотрудника (опять же, поскольку он реализует интерфейс IEntity), не требуя явного приведения.   -  person Alan    schedule 23.06.2010


Ответы (7)


Нет, так как Employee — это класс, который является ссылочным типом, а не тип значения.

Из MSDN:

Упаковка — это процесс преобразования типа значения в объект типа или в любой тип интерфейса, реализованный этим типом значения. Когда среда CLR упаковывает тип значения, она упаковывает значение в System.Object и сохраняет его в управляемой куче. Распаковка извлекает тип значения из объекта.

Вышеупомянутая ссылка MSDN содержит дополнительные примеры, которые должны помочь прояснить тему.

person Ahmad Mageed    schedule 23.06.2010
comment
Вероятно, стоит уточнить тот факт, что, хотя этого нет в реальном примере, который показывает OP, он может быть в другой ситуации. - person Rob Levine; 23.06.2010

В приведенном выше примере нет, но иногда да.

Упаковка — это процесс «упаковки» типа значения в объект, на который можно ссылаться; ссылочный тип. В приведенном выше примере Employee уже является ссылочным типом, поэтому он не помещается в коробку, когда вы приводите его к IEntity.

Однако если бы Employee был типом значения, например структурой (вместо класса), тогда да.

person Rob Levine    schedule 23.06.2010

Как уже говорили другие, приведение ссылочного типа к интерфейсу НЕ является примером упаковки, а приведение типа значения к интерфейсу 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's memory. 
//The struct's 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.
person drwatsoncode    schedule 12.01.2013
comment
Спасибо за примеры! Очень помог! - person Leon Bohmann; 23.10.2019

No.

Потому что emp1 является ссылочным типом.

Упаковка происходит, когда тип значения преобразуется в объект или тип интерфейса.

person Alan    schedule 23.06.2010

Нет, это не так.

Ваш экземпляр Employee уже является ссылочным типом. Ссылочные типы хранятся в куче, поэтому их не нужно упаковывать/распаковывать.

Бокс происходит только тогда, когда вы сохраняете тип значения в куче или, на языке MSDN, вы можете сказать:

Упаковка — это неявное преобразование типов значений (справочник по C#) в объект типа или в любой тип интерфейса, реализованный этим типом значения. Упаковка типа значения выделяет экземпляр объекта в куче и копирует значение в новый объект.

person Justin Niessner    schedule 23.06.2010

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

person Femaref    schedule 23.06.2010

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

person Gary    schedule 23.06.2010
comment
Я думаю, вы имеете в виду запятую после первого слова в вашем кратком ответе. Без этого - то есть в том виде, в каком ваш ответ сейчас стоит, - он имеет противоположное значение и, следовательно, неверен. - person Glenn Slayden; 28.12.2011