为什么接口是引用类型?据我所知,接口是类(或结构体)之间的契约,那么为什么它会成为一种类型呢?我认为它既不是值类型也不是引用类型。
为什么接口是引用类型?据我所知,接口是类(或结构体)之间的契约,那么为什么它会成为一种类型呢?我认为它既不是值类型也不是引用类型。
要将结构体视为一种结构,在编译时必须知道具体类型,以便在堆栈上保留正确的空间。这意味着即使一个结构体实现了IFoo
,也是如此。
var ms = new MyStruct();
IFoo foo = ms;
foo
进行赋值,那么这是一个装箱操作。你可以说“编译器应该注意到它仅仅是一个foo并使用'constrained'操作码”,但在一般情况下(多次对foo
进行赋值等)这是不可能的(我猜测它会遇到“停机问题”)。static void DoBar<T>(T target) where T : IFoo {
target.Bar();
}
这里该方法被针对每种值类型进行了即时编译,因此需要的栈空间 T
已知;对Bar
的调用是"受限制的",可以根据需要自动变为虚拟或静态。
它们是引用类型,因为值类型在编译时具有固定大小,因此可以在堆栈上分配。引用类型是指针,因此指针是恒定大小的,但它们可以指向任何大小的内存。