值类型变量直接包含实际数据,引用类型变量包含对实际数据的引用。
我认为这是:
l.h.s是值类型,r.h.s是引用类型
在左侧,如果我将 i
复制到 j
中,新的内存位置将填充相同的原始数据 (45)。
在右侧,如果我将k
复制到l
,一个新的内存位置将填充对象的引用;并且此引用指向内存中的实际对象。
现在,我对这种引用类型复制感到困惑。这里有一点不同:
这里,r.h.s 上的副本使 l
指向与 k
相同的位置。
我的问题是1。 “哪个更真实?”还是比我想象的更真实?
此外,值类型可以分配在堆上,这取决于抖动认为它适合的方式,然后 2。我们可以强制在堆栈上分配引用类型吗?
抱歉图片编辑草率。
最佳答案
第一张图比较好,l
和k
是不同的变量,在内存中占据不同的位置。
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/