2010-06-23 9 views
11

tengo una interfaz IEntity¿Está convirtiendo a una interfaz una conversión de boxeo?

public interface IEntity{ 
    bool Validate(); 
} 

Y tengo un empleado de la clase que implementa esta interfaz

public class Employee : IEntity{ 
    public bool Validate(){ return true; } 
} 

Ahora bien, si tengo el código

Employee emp1 = new Employee(); 
IEntity ent1 = (IEntity)emp1; // Is this a boxing conversion? 

siguiente si no es una la conversión del boxeo, ¿cómo funciona el elenco?

+0

En este caso, el molde no es necesario. El empleado implementa la interfaz IEntity, por lo que puede asignar libremente una referencia a IEntity (ent1 en su ejemplo) a cualquier referencia de Employee (nuevamente ya que implementa la interfaz IEntity) sin requerir un lanzamiento explícito. – Alan

Respuesta

16

No, ya que Employee es una clase, que es reference type en lugar de value type.

De MSDN:

boxeo es el proceso de convertir un tipo valor para el objeto de texto o para cualquier tipo interfaz implementada por este tipo valor. Cuando el CLR incluye un tipo de valor , envuelve el valor dentro de un System.Object y lo almacena en el montón administrado . Unboxing extrae el tipo de valor del objeto.

El enlace de MSDN antes mencionado tiene más ejemplos que deberían ayudar a aclarar el tema.

+0

Probablemente valga aclarar el hecho de que, aunque no se encuentra en el ejemplo real que muestra el OP, * puede estar * en una situación diferente. –

0

No, no lo es.

Su instancia de empleado ya es un tipo de referencia. Los tipos de referencia se almacenan en el Heap, por lo que no es necesario incluirlo/desempaquetarlo.

boxeo sólo se produce cuando se almacena un tipo de valor en el montón o, en el lenguaje de MSDN, se podría decir:

boxeo es una conversión implícita de un Tipos de Valores (Referencia de C#) para el tipo objeto o a cualquier tipo de interfaz implementado por este tipo de valor. Boxing un tipo de valor asigna un objeto instancia en el montón y copia el valor en el nuevo objeto.

0

No, el boxeo se produce al convertir un tipo de valor a un objeto.

+0

Creo que quieres tener una coma ',' después de la primera palabra en tu breve respuesta. Sin esto, es decir, tal como se encuentra actualmente su respuesta, tiene el significado opuesto, y por lo tanto es incorrecto. –

0

Boxing significa convertir un tipo de valor en un objeto. Está convirtiendo un tipo de referencia a otro tipo de referencia, por lo que esta no es una conversión de boxeo.

8

En su ejemplo anterior, no, pero a veces sí.

El boxeo es el proceso de "encajonar" un tipo de valor en un objeto referenciable; un tipo de referencia. En su ejemplo anterior, Employee ya es un tipo de referencia, por lo que no está encuadrado cuando lo lanza a IEntity.

Sin embargo, si Employee hubiera sido un tipo de valor, como una estructura (en lugar de una clase), entonces sí.

2

Porque emp1 es un tipo de referencia.

El boxeo se produce cuando un tipo de valor se convierte en un objeto o en un tipo de interfaz.

4

Como han dicho otros, la conversión de un tipo de referencia a una interfaz NO es un ejemplo de boxeo, sino que arroja un Tipo de valor a una interfaz 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. 
Cuestiones relacionadas