7

这可能是一个愚蠢的问题,我忽略了一个明显的答案,但如果我有以下情况:

interface A { }
struct B {
    A some_field;
}

那么 B 的默认 ctor 会让我得到什么,因为它在引擎盖下会有多大(以字节为单位)?

换句话说(从另一个角度来看),接口类型的默认值是什么?它会被认为是引用类型还是值类型,因为类(引用)和结构(值)都可以从它继承?

4

2 回答 2

13

接口是引用类型。

接口类型的字段将始终为一个指针宽,并且默认为null.

如果您分配一个实现接口的结构,该结构将被装箱,并且该字段将包含对装箱对象的引用。

于 2013-08-16T16:25:00.190 回答
3

正如 SLaks 所指出的,一个接口类型的变量将表现为一个引用持有者,众所周知,除了任何一个null或对实现接口的对象的引用之外,它永远不会包含任何其他内容。与所有引用持有者一样,默认值为null.

一个泛型类型的变量,它被限制为接口类型(例如在类中

Thing<T> where T:IComparable<T>
{T foo;
 ...}

字段Foo将具有与实际替换的任何类型相同的默认值T。例如,给定

struct SimplePoint : IComparable<SimplePoint>
{public int x,y; 
 public int CompareTo(SimplePoint other)
   {...}
...}

然后在 内Thing<SimplePoint>,该字段Foo将具有默认值 (0,0)。

顺便说一句,值得注意的是,虽然从结构类型转换为任何引用类型,包括它实现的接口,都会产生对包含结构字段快照的新堆对象的引用,将该引用转换为其他引用类型将产生对同一堆实例的引用。

于 2013-08-17T19:34:16.563 回答