13

我有一个接口 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?

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

4

7 回答 7

18

不,因为Employee是一个类,它是引用类型而不是值类型

来自MSDN

装箱是将值类型转换为类型对象或此值类型实现的任何接口类型的过程。当 CLR 将值类型装箱时,它会将值包装在 System.Object 中并将其存储在托管堆中。拆箱从对象中提取值类型。

前面提到的 MSDN 链接有进一步的例子,应该有助于澄清这个话题。

于 2010-06-23T13:19:41.333 回答
9

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

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

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

于 2010-06-23T13:17:45.003 回答
5

正如其他人所说,将引用类型转换为接口不是装箱的示例,而是将值类型转换为接口 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.
于 2013-01-12T01:33:14.363 回答
2

不。

因为 emp1 是引用类型。

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

于 2010-06-23T13:18:52.077 回答
0

不,这不对。

您的 Employee 实例已经是一个引用类型。引用类型存储在堆上,因此不需要装箱/拆箱。

仅当您在堆上存储值类型时才会发生装箱,或者在 MSDN 语言中,您可以说:

装箱是将值类型(C# 参考)隐式转换为类型对象或此值类型实现的任何接口类型。装箱值类型会在堆上分配一个对象实例并将值复制到新对象中。

于 2010-06-23T13:17:01.673 回答
0

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

于 2010-06-23T13:17:22.563 回答
0

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

于 2010-06-23T13:17:23.523 回答