gpt4 book ai didi

.net - 在 .NET 中,对象引用的具体类型是什么?

转载 作者:行者123 更新时间:2023-12-04 18:51:58 24 4
gpt4 key购买 nike

IE。存储在堆栈上的值类型数据结构的名称是什么,它引用了堆上的对象?

IE。对象引用是 System.What(如果有的话)?

我知道这不是 pointer ,或者是吗?

我知道它“像”一个指针。

我知道它是“由垃圾收集器拥有的”。

我迷信认为,当您实例化一个对象(即引用类型)时,IL 会向 CLR 发出指令以在内存中分配“堆栈引用/堆值对”(例如

...
.locals init ([0] int32 i1,
[1] object o1,
[2] int64 l1)
IL_0000: nop
IL_0001: ldc.i4.4
IL_0002: stloc.0
IL_0003: newobj instance void [mscorlib]System.Object::.ctor()
IL_0008: stloc.1
IL_0009: ldloc.0
IL_000a: box [mscorlib]System.Int32
...

)
,并且在语言或 IL 级别上无法访问实际引用(复制/分配给新引用或操作被引用对象除外),并且对象引用的分配由 CLR/CLI 创建和管理,并且 CLR 注入(inject)将 OBJECTREF DWORD 值放入堆栈(或类似的)。

请让我直截了当,并为所有书籍作者和谷歌搜索结束这一切。

谢谢!

最佳答案

在堆栈上创建的值类型没有对堆上任何对象的引用——堆上没有对应的对象。这只会在值类型被装箱时创建 - 在这种情况下,这两者之间仍然没有关系。

这就是为什么当您更 retrofit 箱引用类型的值时,原始变量保持不变。每当您装箱时,都会创建一个新对象。

这是一个简单的方法:

    private void TestBoxing()
{
int i = 52;
object io = i;
io = "something else";

}

这是生成的 IL 代码:
.method private hidebysig instance void  TestBoxing() cil managed
{
// Code size 18 (0x12)
.maxstack 1
.locals init ([0] int32 i,
[1] object io)
IL_0000: nop
IL_0001: ldc.i4.s 52
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: box [mscorlib]System.Int32
IL_000a: stloc.1
IL_000b: ldstr "something else"
IL_0010: stloc.1
IL_0011: ret
} // end of method Program::TestBoxing

如您所见,这个 .locals init ([0] int32 i, [1] object io)只不过是初始化局部变量,一个int和一个对象。

(更新)

I was asking what is the specific type of the reference on the stack which refers to the object on the heap



它是普通对象引用 ,类似于所有对象引用,它引用内存中的一个点,该点具有 4 字节类型指针和 4 字节同步块(synchronized block),然后 rest 是对象所需的空间,在我们的例子中 int 需要 4 个字节所以 12 个字节。

(更新2)

好吧,我不认为它有名字,它是 CLR 的内部指针 (32 位或 64 位取决于运行时)在 CLR 之外没有用处且未公开。如您所知,它由 GC 管理,因为垃圾回收后对象在堆上移动后值会发生变化。

关于.net - 在 .NET 中,对象引用的具体类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869433/

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