Sun*_*nny 3 c# memory-management
我知道无法实例化接口,但是如果我们将其分配给对象,那么谁能解释一下如何为它分配内存。例如:
ITest obj = (ITest) new TestClass1(); //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();
Run Code Online (Sandbox Code Playgroud)
ITest是否转换为对象以保存TestClass1的属性和方法。
我不确定“分配”到底是什么意思。以下语句进行了两个单独的“分配”:
TestClass1 test = new TestClass1();
Run Code Online (Sandbox Code Playgroud)
首先是new TestClass1()在堆上分配sizeof(TestClass1)的语句。其次,堆分配地址的分配存储在变量中test,该变量作为sizeof(object *)(即IntPtr.Size或基于运行的硬件+ OS +软件的32/64位)分配在堆栈上。
以下语句在“分配”中完全相同:
ITest test = new TestClass1();
Run Code Online (Sandbox Code Playgroud)
两者之间的唯一区别是可以在变量上调用的方法test。
注意:对于实现接口的结构,情况并非如此。接口必须是引用类型,并且您知道结构不是。这在.NET中称为装箱,通过先将结构的副本放在堆上,就可以像引用类型一样引用结构。
因此,我们现在重新评估该语句:
TestSTRUCT1 test2 = new TestSTRUCT1();
Run Code Online (Sandbox Code Playgroud)
这会在堆栈上的指定变量处分配sizeof(TestSTRUCT1)test2。(不确定分配的影响是什么new TestSTRUCT1(),它可能会创建一个额外的堆栈副本,但应在分配后立即将其删除。
如果我们然后将此值分配给接口:
ITest test3 = test2;
Run Code Online (Sandbox Code Playgroud)
现在,我们又进行了两次分配。首先,将结构复制到堆中。然后,将该堆驻留结构的地址放置在新的“已分配”变量中test3(在堆栈上)。