gpt4 book ai didi

c# - 清除对值和引用类型的疑虑

转载 作者:太空狗 更新时间:2023-10-30 00:43:03 25 4
gpt4 key购买 nike

值类型变量直接包含实际数据,引用类型变量包含对实际数据的引用。

我认为这是:

l.h.s是值类型,r.h.s是引用类型

enter image description here

在左侧,如果我将 i 复制到 j 中,新的内存位置将填充相同的原始数据 (45)。

在右侧,如果我将k 复制到l,一个新的内存位置将填充对象的引用;并且此引用指向内存中的实际对象。

现在,我对这种引用类型复制感到困惑。这里有一点不同:

enter image description here

这里,r.h.s 上的副本使 l 指向与 k 相同的位置。

我的问题是1。 “哪个更真实?”还是比我想象的更真实?

此外,值类型可以分配在堆上,这取决于抖动认为它适合的方式,然后 2。我们可以强制在堆栈上分配引用类型吗?

抱歉图片编辑草率。

最佳答案

第一张图比较好,lk是不同的变量,在内存中占据不同的位置。

value types may be allocated on heap, depending upon the how jitter sees it fit

实际上它更多地取决于上下文和值的使用方式。值类型字段总是分配在堆上,装箱和闭包是其他原因。

但是,当 l 是一个 ref 参数时,第二张图片适用:

MyClass k = new ...;
M(ref k);

void M(ref MyClass l) { /* Here l is an alias for k */ }

then 2. Can we force a reference type to be allocated on stack?

有类似 stackalloc 的东西,但它是一种对 C# 程序员“不可见”的优化。
简单而最有用的答案是:不。

关于c# - 清除对值和引用类型的疑虑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341947/

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