我正试图在C#规范中消化这个陈述,其中说明了(§4.2):
引用类型是类类型,接口类型,数组类型或委托类型。
我知道结构可以实现接口。结构是价值类型。
所以,我无法协调这些信息。这是否意味着当通过接口类型处理时,结构体表现为引用类型?这意味着您可以获得对值类型的引用...
答案 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;的兼容性)。