2011-06-10 27 views
2

我试图消化在C#规范,其中规定(4.2节)这种说法:在引用类型和值类型在C#规范轻微混乱

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

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

所以,我很难调和这些信息。这是否意味着结构在通过接口类型处理时表现为引用类型?这将意味着,你可以得到一个值类型的引用...

回答

3

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

什么你不能有一个接口参照值类型实例在栈上,或者在另一个内部类。拳击过程创建一个副本。

1

是,struct S可实现一个接口,但它们不是一个接口类型。 A struct是一种值类型,当需要时将被装箱。

3

是的,你可以得到一个值类型的引用。任何时候将值类型分配给变量或将其作为参数传递给需要Object类型的方法时,值类型都会隐式包装在对象实例中 - 这是一个称为装箱的过程。拳击正在创建一个包含值的对象引用。当盒装对象被分配或使用像一个值类型,然后它被拆箱并提取值。

1

其实现,如果它被浇铸到所述接口,但如果它被浇铸到被约束为实现该接口的通用类型的接口将盒装一个结构。例如:

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

注意的是,虽然上面的代码中使用结构时,比较值类型T的两个对象需要三个拷贝操作避免了拳击。如果参数作为参考,而不是通过值传递,与值类型的性能将得到加强,在受损的参考型性能(并且,当然,相容性与现有IComparable的<Ť>和的IComparer <Ť>)为代价的。

+0

有趣。感谢您的回答! – Cameron 2011-10-06 17:23:13