接口类型的默认值

7
这可能是一个愚蠢的问题,但如果我有以下内容:

这可能是一个愚蠢的问题,但如果我有以下内容:

interface A { }
struct B {
    A some_field;
}

那么B的默认构造函数将会得到多少字节大小的内容呢?

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

2个回答

14

接口是参考类型。

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

如果您分配了实现接口的结构体,则该结构体将被装箱,该字段将包含对装箱对象的引用。


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)。

顺便提一下,将结构类型转换为任何引用类型(包括它实现的接口)都会产生一个引用,指向包含结构字段快照的新堆对象。但将该引用转换为其他引用类型将产生一个指向相同堆实例的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接