对C#规范中引用类型和值类型的轻微混淆

时间:2011-06-10 03:57:37

标签: c# value-type reference-type specifications

我正试图在C#规范中消化这个陈述,其中说明了(§4.2):

  

引用类型是类类型,接口类型,数组类型或委托类型。

我知道结构可以实现接口。结构是价值类型。

所以,我无法协调这些信息。这是否意味着当通过接口类型处理时,结构体表现为引用类型?这意味着您可以获得对值类型的引用...

5 个答案:

答案 0 :(得分:3)

这是一篇可能具有说明性的博文。

http://blogs.msdn.com/b/abhinaba/archive/2005/10/05/477238.aspx

是的,如果将接口处理为接口,那么实现接口的结构将被装箱作为引用类型,是的,如果你不小心,这会导致问题。

答案 1 :(得分:3)

这是对的。在需要接口引用的上下文中使用值类型时,它将被装箱。如果需要System.Object,也会发生同样的事情。

您不能拥有的是对堆栈上的值类型实例或其他类型内部的接口引用。拳击过程创建一个副本。

答案 2 :(得分:3)

是的,您可以获得对值类型的引用。无论何时将值类型分配给变量或作为参数传递给期望Object类型的方法,值类型都隐式包装在对象实例中 - 称为装箱的过程。拳击正在创建一个包含值的对象引用。当盒装对象被赋值给或像值类型一样使用时,它将被取消装箱并提取值。

答案 3 :(得分:1)

是的,struct可以实现接口,但它们不是接口类型。 struct是值类型,必要时将装箱。

答案 4 :(得分:1)

实现接口的结构体如果被强制转换为接口,则将被加框,但如果它被强制转换为限制实现接口的泛型类型则不会。例如:

void Compare<T>(T thing1, T Thing2) where T:IComparable<T>
{
   return thing1.CompareTo(Thing2);
}

请注意,虽然上面的代码在使用结构时避免了装箱,但比较两个值类型为T的对象将需要三次复制操作。如果通过引用而不是通过值传递参数,则将增强具有值类型的性能,代价是受损的参考类型性能(当然,与现有IComparable&lt; T&gt;和IComparer&lt; T&gt;的兼容性)。