对C#规范中的引用类型和值类型略有混淆
本文关键字:类型 范中 引用类型 | 更新日期: 2023-09-27 17:58:54
我正试图在C#规范中消化这句话,它指出(§4.2):
引用类型是类类型、接口类型、数组类型或委托类型。
我知道structs可以实现接口。结构是值类型。
所以,我很难协调这些信息。这是否意味着结构在通过接口类型处理时表现为引用类型?这意味着您可以获得对值类型的引用。。。
这里有一篇博客文章可以说明问题。
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>的兼容性)。