为什么.Net引用类型中的接口?

时间:2011-01-09 08:41:41

标签: .net interface types reference

为什么接口引用类型?据我所知,接口是类(或结构)之间的契约,那为什么它是一个类型呢?我原以为它既不是值类型也不是引用类型。

2 个答案:

答案 0 :(得分:11)

要被视为结构,编译器必须知道在编译时具体类型是什么,以在堆栈上保留正确的空间。这意味着即使结构实现IFoo,然后使用:

var ms = new MyStruct();
IFoo foo = ms;

然后对foo的赋值是装箱操作。你可以说“编译器应该发现,只有永远的foo和使用‘constained’代码”,但在一般情况下的(多分配到foo等)这ISN不可能(我猜测它会遇到“停止问题”)。

还存在虚拟与静态调用的问题,但“约束”操作码可以解决这个问题。

基本上,必须始终将接口的任何用法视为参考。

这有一个例外:通用约束。

如果你有

static void DoBar<T>(T target) where T : IFoo {
    target.Bar();
}

这里的方法是每值型即时编译一次,所以所需要的堆栈空间T已知的;对Bar的调用是“受约束的”,可以根据需要自动虚拟或静态。

答案 1 :(得分:3)

它们是引用类型,因为值类型在编译时具有固定大小,因此可以在堆栈上分配它们。引用类型是指针,因此指针是常量大小的,但它们可以指向任何大小的内存。