对C#规范中的引用类型和值类型略有混淆

本文关键字:类型 范中 引用类型 | 更新日期: 2023-09-27 17:58:54

我正试图在C#规范中消化这句话,它指出(§4.2):

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

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

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

对C#规范中的引用类型和值类型略有混淆

这里有一篇博客文章可以说明问题。

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

是的,如果你把实现接口的结构作为接口处理,它们就会被作为引用类型装箱,是的,这可能会导致问题,如果你不小心的话。

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

不能有对堆栈上或另一个类型内的值类型实例的接口引用。装箱过程会创建一个副本。

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

是的,struct可以实现接口,但它们不是接口类型。struct是一种值类型,需要时会装箱。

如果将实现接口的结构强制转换为接口,则该结构将被装箱,但如果将其强制转换为受约束以实现接口的泛型类型,则不会装箱。例如:

void比较<T>(T thing1,T Thing2),其中T:IComparable<T>{return thing1.CompareTo(Thing2);}

注意,虽然上面的代码在使用structs时避免了装箱,但比较两个值类型为T的对象将需要三次复制操作。如果参数是通过引用而不是通过值传递的,那么值类型的性能将得到增强,而代价是引用类型性能受损(当然,还有与现有IComparable<T>和ICompararer<T>的兼容性)。