代码之家  ›  专栏  ›  技术社区  ›  Hemanshu Bhojak

转换到接口是装箱转换吗?

  •  12
  • Hemanshu Bhojak  · 技术社区  · 14 年前

    我有一个接口

    public interface IEntity{
        bool Validate();
    }
    

    我有一个类雇员实现了这个接口

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

    如果我有下面的代码

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

    如果不是拳击转换,那么演员表如何工作?

    7 回复  |  直到 11 年前
        1
  •  17
  •   Ahmad Mageed    14 年前

    不,因为 Employee 是一个类,它是 reference type 而不是 value type .

    MSDN :

    拳击是将 值类型到类型对象或到 由此实现的任何接口类型 值类型。当clr值为 类型,它将值包装在 System.Object并将其存储在 托管堆。拆箱提取 对象的值类型。

    前面提到的msdn链接有更多的示例,应该有助于澄清主题。

        2
  •  9
  •   Rob Levine    14 年前

    在上面的例子中,不是,但有时是。

    装箱是将值类型“装箱”为可引用对象;引用类型的过程。在上面的示例中,Employee已经是引用类型,因此当您将其强制转换为IEntity时,它不会被装箱。

    但是,如果雇员是一个值类型,例如结构(而不是类),那么是的。

        3
  •  4
  •   drwatsoncode    11 年前

    正如其他人所说,将引用类型强制转换为接口并不是装箱的例子,但将值类型强制转换为接口则是。

    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.
    
        4
  •  2
  •   Alan    14 年前

    不。

    因为emp1是引用类型。

    装箱在值类型转换为对象或接口类型时发生。

        5
  •  0
  •   Justin Niessner    14 年前

    不,不是。

    您的Employee实例已经是引用类型。引用类型存储在堆中,因此不需要装箱/取消装箱。

    装箱仅在堆中存储值类型时发生,或者在msdn语言中,可以说:

    装箱是对 值类型(C引用)到类型 对象或任何接口类型 由该值类型实现。拳击 值类型分配对象 堆上的实例并复制 新对象中的值。

        6
  •  0
  •   Femaref    14 年前

    装箱意味着将值类型转换为对象。您正在将引用类型转换为另一个引用类型,因此这不是装箱转换。

        7
  •  0
  •   Gary    13 年前

    不,将值类型转换为对象时将发生装箱。