gpt4 book ai didi

c# - 接口(interface)内存分配

转载 作者:行者123 更新时间:2023-11-30 13:23:14 24 4
gpt4 key购买 nike

我知道接口(interface)不能被实例化,但是如果我们将它分配给一个对象,谁能解释一下内存是如何分配给它的。例如:

ITest obj = (ITest) new TestClass1();  //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();

ITest是否转为对象保存TestClass1的属性和方法。

最佳答案

我不确定您所说的“分配”到底是什么意思。以下语句进行了两个单独的“分配”:

TestClass1 test = new TestClass1();

首先是在堆上分配 sizeof(TestClass1) 的 new TestClass1() 语句。二、堆分配地址的赋值存储在变量test中,在栈上分配为sizeof(object *)(即IntPtr.Size,或者32/64位基于硬件+操作系统+软件运行)。

以下语句在“分配”中完全相同:

ITest test = new TestClass1();

两者之间的唯一区别是可以在变量 test 上调用的方法。

注意:对于实现接口(interface)的结构而言,情况并非如此。接口(interface)必须 是引用类型,如您所知,结构不是。这在 .NET 中称为装箱,它允许通过首先将结构的副本放在堆上来引用结构,就好像它是引用类型一样。

所以我们现在重新评估声明:

TestSTRUCT1 test2 = new TestSTRUCT1();

这在命名变量 test2 的堆栈上“分配”sizeof(TestSTRUCT1)。 (不确定对 new TestSTRUCT1() 赋值的影响是什么,它可能会创建一个额外的堆栈副本,但应在赋值后立即将其删除。

如果我们随后将此值分配给接口(interface):

ITest test3 = test2;

我们现在又进行了两次分配。首先将结构复制到堆中。然后,该堆驻留结构的地址被放置在新“分配”的变量 test3 中(在堆栈上)。

关于c# - 接口(interface)内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com