2

我试图在 C# 规范中消化这个陈述,其中指出(§4.2):

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

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

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

4

5 回答 5

3

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

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

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

于 2011-06-10T04:00:45.680 回答
3

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

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

于 2011-06-10T04:01:16.993 回答
3

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

于 2011-06-10T04:03:23.807 回答
1

是的,structs 可以实现接口,但它们不是接口类型。Astruct是一个值类型,需要时将被装箱。

于 2011-06-10T04:01:37.770 回答
1

如果将实现接口的结构转换为接口,则将其装箱,但如果将其转换为受限于实现接口的泛型类型,则不会。例如:

void Compare<T>(T thing1, T Thing2) 其中 T:IComparable<T>
{
   返回 thing1.CompareTo(Thing2);
}

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

于 2011-10-06T16:51:02.740 回答